我尝试使用父类来构建软件,该类调用派生类函数,而不知道派生类本身。我没有找到真正的解决方案,一直在考虑它。我想我应该从派生类中获取一个指针,以便使用父类执行代码。
这就是我想要实现的目标:
我有一个带有纯虚函数的父类。派生类将实现所述函数。父类还将有一个静态函数,其中(使用向量)将执行派生类函数的代码。
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更新方法一样。
答案 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