通过模板复制派生对象C++

Duplicate Derived Object via C++ Template

本文关键字:派生 对象 C++ 复制      更新时间:2023-10-16

我知道这不会编译,我知道"DerivedTemplate"类型不直接实现抽象成员函数。我想知道的是为什么,即什么规则阻止它起作用?

#include <iostream>
#include <memory>
template<typename DuplicateType, typename DuplicatedReturnType = DuplicateType>
struct EnableDuplication
{
    virtual ~EnableDuplication()
    {}
    virtual std::unique_ptr<DuplicatedReturnType> duplicate() const
    {
        std::cout << "Using the templated duplication." << std::endl;
        const auto& thisObj{static_cast<const DuplicateType&>(*this)};
        return std::make_unique<DuplicateType>(thisObj);
    }
};
struct Base
{
    Base(int value) : value_(value)
    {}
    virtual ~Base()
    {}
    virtual std::unique_ptr<Base> duplicate() const =0;
    const int value_;
};
struct DerivedTemplate : Base, EnableDuplication<DerivedTemplate, Base>
{
    DerivedTemplate(int value) : Base(value)
    {}
};
struct DerivedImplement : Base
{
    DerivedImplement(int value) : Base(value)
    {}
    virtual std::unique_ptr<Base> duplicate() const override
    {
        std::cout << "Using the implented duplication." << std::endl;
        return std::make_unique<DerivedImplement>(*this);
    }
};
void printValue(const Base& original, const std::unique_ptr<Base>& copy)
{
    std::cout << "Value of derived is: " << original.value_ << 
        "nValue of copy is: " << copy->value_ << std::endl;
}
int main(int argc, const char* argv[])
{
    DerivedTemplate dt{5};
    auto copyt{dt.duplicate()};
    printValue(dt, copyt);
    DerivedImplement di{5};
    auto copyi{di.duplicate()};
    printValue(di, copyi);
    return 0;
}

你的多头像这样:

EnableDuplication  Base
                   /
     DerivedTemplate

派生模板从两个基类继承相同的方法。你没有凌驾于任何东西之上。在我看来,你的说法是错误的:"而且我知道"衍生模板"类型并不直接实现抽象成员函数。 - 问题是它甚至没有间接实现。它根本没有。您希望语言做的是覆盖,但您没有告诉它这样做。

它不编译,因为DerivedTemplate派生自Base但未实现纯虚函数:

virtual std::unique_ptr<Base> duplicate() const =0;

如果您实现上述功能,它将起作用:

struct DerivedTemplate : Base, EnableDuplication<DerivedTemplate, Base>
{
    DerivedTemplate(int value) : Base(value)
    {}
    virtual std::unique_ptr<Base> duplicate() const override
    {
        std::cout << "DerivedTemplate::duplicate()n";
        return std::make_unique<DerivedTemplate>(*this);
    }
};

演示