我知道这不会编译,而且我知道“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/