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

时间:2015-06-29 22:56:51

标签: c++ class derived-class

#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不是多态的(没有虚函数)。从这些条件中,我如何能够为每个Derived1对象调用func1,为每个Derived2对象调用func2?

2 个答案:

答案 0 :(得分:1)

  

“Base不是多态的(没有virtual函数)。”

只要您确定在特定索引处获得的内容,您仍然可以执行static_cast<Derived1>(v[0]) / static_cast<Derived2>(v[1]),a.s.o.

答案 1 :(得分:0)

原样,这是不可能的。你不能dynamic_cast,没有指明一种类型或另一种类型的成员。鉴于Base*Derived1*还是Derived2*,绝对无法区分。

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

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

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

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

  4. 添加virtual ~Base()以便代替切换,您可以执行dynamic_cast

  5. 实际上Derived1Derived2实际上并非Base,而是variant<Derived1, Derived2>

  6. ???

  7. 利润。

相关问题