从虚拟方法返回派生对象作为基础
Returning derived object as base from virtual method
基类中有一些虚拟方法返回同一基本对象(不是指针(。在某些虚拟覆盖中,我想返回派生的对象作为基础。但是问题是,方法总是会从返回派生中创建基本对象。这是简单的示例:
#include <iostream>
#include <string>
class Base {
public:
Base() {}
virtual std::string myName() { return "Base"; }
virtual Base createAlike() { return Base(); }
};
class Derived : public Base {
public:
Derived() : Base() {}
std::string myName() override { return "Derived"; }
Base createAlike() override { return Derived(); }
};
int main() {
Derived d;
Base d1 = d.createAlike();
std::cout << d.myName() << std::endl;
std::cout << d1.myName();
return 0;
}
输出:
Derived
Base
如何纠正它?
由于您按值返回,返回值是您返回的表达式的副本。由于该返回类型始终是Base
,因此Derived
对象被切成薄片。为了使多态性起作用,您通常需要指针或参考。
使用std::unique_ptr
尝试一下:
#include <iostream>
#include <string>
#include <memory>
class Base {
public:
Base() {}
virtual std::string myName() { return "Base"; }
virtual std::unique_ptr<Base> createAlike()
{ return std::make_unique<Base>(); }
};
class Derived : public Base {
public:
Derived() : Base() {}
std::string myName() override { return "Derived"; }
std::unique_ptr<Base> createAlike() override
{ return std::make_unique<Derived>(); }
};
int main() {
Derived d;
auto d1 = d.createAlike();
std::cout << d.myName() << std::endl;
std::cout << d1->myName();
return 0;
}
相关文章:
- 将作用域枚举转换为基础类型
- 将整数值转换为以枚举为基础的字符串
- 当对象为值时访问实例方法<map>
- 对象为空,在调用函数中使用指针作为参数
- 使用PYBIND11,如何为Array_t对象设置基础内存的所有权
- 从虚拟方法返回派生对象作为基础
- 促进序列化对象为json
- 为什么包装 setMouseCallback 会导致 Mat 对象为空
- 如何编写以对象为参数的可变模板函数?
- 为基础类构造函数提供初始化的成员
- 在CMAKE中,如何以每个用户为基础更改构建类型的默认编译器标志
- C++:同一对象的基础与派生的指针比较
- 成员对象为unique_ptr或在堆栈上
- 当类对象为常量时,使类中的shared_ptr无法更改它所指向的对象
- 如何在运行时确定对象的基础类型
- 对象为模板时的静态构造
- 以临时对象为参数的C++对象构造函数
- Lambda Capture by Value强制所有作用域对象为常量
- 使用类对象为类的结构赋值
- 如果包含的对象也继承,我如何定义相互继承的容器?(以QObject为基础)