通过模板复制派生对象C++
Duplicate Derived Object via C++ Template
我知道这不会编译,我知道"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);
}
};
演示
相关文章:
- 为什么此派生对象无法访问基类的后递减方法?
- 如何在新的派生对象中获取基本对象的数据?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 在没有默认构造函数的情况下创建的派生对象
- OOP 标识派生对象
- 如何创建派生对象的向量?
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- 如何从 Gtk::窗口调用派生对象的析构函数
- 无法在派生对象上运行虚拟函数
- 尝试删除指向派生对象的基指针时断言错误
- 存储在一个通用容器中的派生对象.如何避免铸造
- 将派生对象分配给函数内的基类指针
- 替换派生对象向量中的对象"no matching function to call"
- 派生对象调用的 Base 方法的模板推导
- 用于填充 Base 和派生对象的 shared_ptr 向量的函数模板
- C++ UBSAN 对派生对象产生误报
- 如何验证我是否正在使用C++中的基对象或派生对象
- C++ 构造函数和派生对象
- 将派生对象传递给模板
- 指向派生作品的基本指针,即使派生对象不存在