Create child class inside parent's class function - is it possible?
本问题已经有最佳答案,请猛点这里访问。
tl;dr;-我希望能够在父类函数内部创建子类的对象,而不需要指定确切的子类。
现在我必须在每个
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | 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); } |
我想我可以这样做:
1 2 3 | CChild* CChild::replicate(int iversion) { return new<decltype(*this)>(iversion); }; |
所以基本上我需要函数来创建从父类调用的子类的副本。可以这样做吗?
型
您可以在这里使用奇怪的循环模板模式(crtp)进行间接寻址。如果你觉得有意思的话,你可以在wiki上读到crtp。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | 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; } |