从指向基础 class 对象的指针向量调用派生 classes 的独特函数

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

#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()
}

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

"Base is not polymorphic (no virtual function)."

您仍然可以执行 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 构造函数中设置不同的成员变量26=]

  3. 添加一个枚举成员变量来指示它是哪个Derived,这样你就可以在外部做一个开关来做一个安全的static_cast.

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

  5. 实际上没有 Derived1Derived2 继承自 Base,而是有 variant<Derived1, Derived2>.

  6. ???

  7. 利润。