从基类对象的指针向量调用派生类的唯一函数

Invoke unique functions of derived classes from a vector of pointers to base class objects

本文关键字:派生 唯一 函数 调用 向量 基类 对象 指针      更新时间:2023-10-16
#include <iostream>
#include <vector>
using namespace std;
class Base
{
public:
    void speak() { cout << "Hello!"; }
};
class Derived1 : public Base
{
public:
    void func1() { cout << "I'm a function!"; }
};
class Derived2 : public Base
{
public:
    void func2() { cout << "I'm also a function!"; }
};
int main()
{
    vector<Base*> v = { new Derived1(), new Derived2(), new Derived1(), new Derived2() //, ...
    };
    // For each Derived1 object invoke func1() and for each Derived2 object invoke func2()
}

基不是多态的(没有虚拟函数(。根据这些条件,我如何能够为v中的每个Derived1对象调用func1,为每个Derived2对象调用func2?

"碱基不是多态的(没有virtual功能(。">

你仍然可以做static_cast<Derived1>(v[0])/static_cast<Derived2>(v[1]),a.s.o,只要你确定在特定的索引上会得到什么。

照原样,这是不可能的。不能执行dynamic_cast,没有表示一种或另一种类型的成员。对于给定的Base*,绝对没有办法区分它是Derived1*还是Derived2*

您必须执行以下操作之一:

  1. 添加两个不同类将覆盖的virtual void func() = 0;

  2. 添加类型为std::function<void()>的成员变量,这两个Derived类将在Base构造函数中以不同方式设置该成员变量。

  3. 添加一个枚举成员变量来指示它是哪个Derived,这样您就可以在外部进行切换以执行安全的static_cast

  4. 添加一个virtual ~Base(),这样就可以执行dynamic_cast s,而不是切换。

  5. 实际上并没有从Base继承Derived1Derived2,而是有一个variant<Derived1, Derived2>

  6. ???

  7. 利润。