C++ 在父类函数内创建子类-可能吗? TL;博士;-我希望能够在父类的函数中创建子类的对象,而无需指定确切的子类。
类CParent用于在特定于版本的m_数据中存储一些数据。 每个类CChild*都将按照该组中相同的规则使用自己的数据组进行操作 现在我必须在每个CChild*类中声明CParent*replicatent ver,但它们是相同的,我认为我只能在父类中定义这个函数C++ 在父类函数内创建子类-可能吗? TL;博士;-我希望能够在父类的函数中创建子类的对象,而无需指定确切的子类。,c++,inheritance,C++,Inheritance,类CParent用于在特定于版本的m_数据中存储一些数据。 每个类CChild*都将按照该组中相同的规则使用自己的数据组进行操作 现在我必须在每个CChild*类中声明CParent*replicatent ver,但它们是相同的,我认为我只能在父类中定义这个函数 class CParent { public: int m_ver; std::vector<int> m_data; CParent(int ver) { m_ver
class CParent
{
public:
int m_ver;
std::vector<int> m_data;
CParent(int ver)
{
m_ver = ver;
};
CParent *replicate(int ver) { return nullptr; };
void print(int ver) {
if (m_ver == ver) {
// print m_data
}
else {
CParent *pobj = replicate(ver);
// transfer data from
pobj->print(ver);
delete pobj;
}
}
};
class CChild1 : public CParent
{
public:
void CChild1::operator=(const CChild1& src)
{
// code transfering data from src(ver) to this(m_ver);
};
CChild1(int ver) :CParent(ver)
{
// code specific to CChild1 - m_data contain version depenedent data
};
CParent *replicate(int ver)
{
return new CChild1(ver);
}
};
class CChild2 : public CParent
{
public:
void CChild2::operator=(const CChild2& src)
{
// code transfering data from src(ver) to this(m_ver);
};
CChild2(int ver) :CParent(ver)
{
// code specific to CChild2 - m_data contain version depenedent data
};
CParent *replicate(int ver)
{
return new CChild2(ver);
}
};
int main()
{
int ver = 15;
std::vector<CParent*> vecObjets;
vecObjets.push_back(new CChild1(ver));
vecObjets.push_back(new CChild2(ver));
for (auto it : vecObjets)
it->print(1);
for (auto it : vecObjets)
it->print(7);
for (auto it : vecObjets)
it->print(15);
}
我想我可以做这样的事情:
CChild* CChild::replicate(int iversion) {
return new<decltype(*this)>(iversion);
};
所以基本上我需要函数来创建从父类调用的子类的副本。
可以这样做吗?您可以在这里使用奇怪的重复模板模式CRTP进行间接寻址。如果你觉得有趣的话,你可以在维基上阅读CRTP
class Parent
{
public:
virtual Parent *replicate() = 0;
};
template <typename Child>
class CRTP : public Parent
{
public:
Parent *replicate()
{
return new Child();
}
};
class Child1 : public CRTP<Child1> {};
class Child2 : public CRTP<Child2> {};
class Child3 : public CRTP<Child3> {};
int main()
{
Parent *i1 = new Child1;
Parent *i2 = new Child2;
Parent *i3 = new Child3;
Parent *i4 = i1->replicate();
return 0;
}