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

标签 c++ templates

我知道这不会编译,而且我知道“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 从两个基类继承相同的方法。你没有压倒任何东西。在我看来,您的陈述是错误的:“并且我理解“DerivedTemplate”类型不直接实现抽象成员函数。” - 问题是它甚至不是间接的。它根本没有。你想让语言做的是覆盖但你没有告诉它这样做。

关于c++ - 通过 C++ 模板复制派生对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35289322/

相关文章:

c++ - "invalid conversion from ' const char *' to ' char' [-fpermissive] 的问题”

c++ - 使用 GDI+ 打印无效

c++ - 以编程方式为所有用户设置注册表软件策略 key

c++ - 如何确定传递路径的最后一部分是文件、目录还是掩码?

c++ - 如何克服 GCC 限制 "could not convert template argument ' 0' to ' Foo *'"?

模板函数上的 C++ 模板类成员

c++ - 如何在 C++ 中从模板基类的构造函数调用模板父类(super class)的构造函数?

c++ - 使用 fs::recursive_directory_iterator() 和 fs::directory_iterator() 的通用方法

c++ - 具有类类型非类型模板参数的类模板成员的类外定义

c++ - 模板函数类型推导和返回类型