在父级的类函数中创建子类-有可能吗?

时间:2018-07-27 11:42:44

标签: c++ inheritance

TL; DR; -我希望能够在父类的函数内创建子类的对象,而无需指定确切的子类。

class CParent用于在m_data中存储特定于“版本”的某些数据。 每个class CChild*将按照该组中的相同规则处理自己的数据组。

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

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

所以基本上我需要函数来创建从父类调用的子类的副本。 能做到吗?

1 个答案:

答案 0 :(得分:4)

您可以在此处使用间接重复模板模式(CRTP)。如果您觉得有趣,可以在Wiki上阅读有关CRTP的信息。

select = element(by.cssContainingText('mat-card-title', 'Classifications'))
    .all(by.css('mat-pseudo-checkbox'));