从父类调用派生类函数,而不知道派生类

时间:2015-01-14 15:36:36

标签: c++ class inheritance

我尝试使用父类来构建软件,该类调用派生类函数,而不知道派生类本身。我没有找到真正的解决方案,一直在考虑它。我想我应该从派生类中获取一个指针,以便使用父类执行代码。

这就是我想要实现的目标:

我有一个带有纯虚函数的父类。派生类将实现所述函数。父类还将有一个静态函数,其中(使用向量)将执行派生类函数的代码。

class Base {

    static std::vector<Base*> vec;

public:

    virtual void Test() = 0;
    static void Func();
};

class Derived : public Base {
public:
    void Test()
    {
        std::cout<<"hello";
    }
};

void Base::Func()
{
    for (int i = 0; i != vec.size(), i++)
    {
        vec[i]->Test();
    }
}

问题是:我需要调用&#34; Test()&#34;来自每个派生类的函数。但这必须以编程方式完成,因为我不知道将创建其他派生类

实施例

//Base.h
class Base {

        static std::vector<Base*> vec;

    public:

        virtual void Test() = 0;
        static void Func();
};


//Base.cpp
void Base::Func()
{
    for (int i = 0; i != vec.size(), i++)
    {
        vec[i]->Test();
    }
}

我的Base :: Func()将在任何帧被调用。

此时&#34;用户&#34;将创建自己的实现和头文件,如下所示:

//Derived.h
class Derived : public Base {
public:
    void Test() override;
};

//Derived.cpp

void Derived::Test() 
{
    //Insert code here
}

提前感谢您的帮助。

PS我需要类似游戏引擎的更新方法。就像cocos2d更新方法一样。

2 个答案:

答案 0 :(得分:0)

如果你需要派生一个类来实现这个功能,那么没有一个对象就没有办法以你想要的方式调用它。但是,使用它们的向量,就像你的代码那样,它很容易:

#include <iostream>
#include <vector>

using namespace std;

namespace game{

class base{
  void add_to_vec(base* b);
  public:
  base(){add_to_vec(this);}
  virtual void test()=0;
  static void testAll();
};

static vector<base*> vec;

void base::add_to_vec(base* b){vec.push_back(b);}

void base::testAll()
{
  for (int i = 0; i != vec.size(); i++)
  {
    vec[i]->test();
  }
}

}

class derived1 : public game::base{
  public:
  void test() {cout << "Derived 1" << endl;}
};

class derived2 : public game::base{
  public:
  void test() {cout << "Derived 2" << endl;}
};

int main(){
  derived1 a;
  derived2 b;
  game::base::testAll();
}

为简单起见,我省略了从向量中删除对象的代码,你也应该很容易理解。

答案 1 :(得分:-1)

它似乎是CRTP的一个用例(奇怪的重复模板模式)。假设我们在T

类型下有一个模板基数
template<typename T>
struct Base
{
    void Fun()
    {
        ((T*)this)->Fun(); 
    }
}

您在此处执行的操作是将this对象转换为类型T并调用该类型的相应函数。这对哪里有帮助?想象一下从该类继承,只有你在你的类型下模板化(是的,这是合法的)

struct Derived : Base<Derived>
{
    void Fun(); 
}

这样你就可以“在不知道派生类的情况下从父类调用派生类函数”,前提是派生实现了一个由基类“预测”的接口。例如,如果某人定义了新的类Derived2,您可以编写这样的代码

Base<Derived2> obj; 
obj.Fun(); // calls Fun of the derived object