关于c ++:在父类的函数中创建子类 – 是否可能?

Create child class inside parent's class function - is it possible?

本问题已经有最佳答案,请猛点这里访问。

tl;dr;-我希望能够在父类函数内部创建子类的对象,而不需要指定确切的子类。

class CParent用于在m_data中存储一些特定于"版本"的数据。每个class CChild*将使用其自己的数据组,并在该组内使用相同的规则进行操作。

现在我必须在每个CChild*类中声明CParent *replicate(int ver),但它们是相同的,我认为我只能在父类中定义这个函数。

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;
}