派生对象没有使用自己的操作符=
Derived objects are not using their own operator =
我有以下的类层次结构:
#include <iostream>
using namespace std;
class Figure
{
public:
Figure() {};
virtual void print() const { cout << "Figure" << endl; };
Figure& operator=(const Figure& rhs)
{
if (this != &rhs)
{
cout << "Called figure equals" << endl;
}
return *this;
};
};
class Circle : public Figure
{
public:
Circle() {};
virtual void print() const { cout << "Circle" << endl; };
Circle& operator=(const Circle& rhs)
{
if (this != &rhs)
{
Figure::operator=(rhs);
cout << "Called circle equals" << endl;
}
return *this;
};
};
当我向FigureContainer添加派生对象时,对象没有使用自己的操作符=,但它们使用基类操作符并作为基类实例进入数组,因此我不能从派生类调用"打印"函数。
class FigureContainer
{
public:
FigureContainer() { };
int size = 0;
Figure figures[20];
void add(const Figure& figure)
{
figure.print(); // Called circle print !
figures[size] = figure; // Used base = operator instead of the derived figure class
size++;
};
};
int main()
{
FigureContainer* figures = new FigureContainer();
(*figures).add(*new Circle());
(*figures).figures[0].print(); // called abstract print !
system("pause");
return 0;
}
.
Output :
Circle
Called figure equals
Figure
我做错了什么?
在c++中,=
不是虚的。编译器决定哪个类将在编译时提供操作符。赋值figures[i] = ...
由左侧对象的类型处理,因此调用Figure
的操作符。
这是OK的,因为非指针赋值不应该是多态的:Figure
对象的数组只能存储没有对象切片的Figure
对象。存储Circle
将删除对象的所有特定于圆的属性,只留下Figure
部分。
可以通过将figures
设置为一个智能指针数组来解决这个问题。这将保留存储在容器中的对象的子类型,并使使用哪个赋值操作符的问题变得无关紧要。
相关文章:
- 没有为自己的结构调用列表推回方法
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- C++从对象自己的类中删除对象
- 使用 std::optional,而不是自己的结构
- 子轴围绕父轴而不是他自己的轴旋转
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- C++ 如何为自己的迭代器类从迭代器转换为const_iterator?
- 重载 + 自己的类和 std::string 的运算符
- 类无法访问自己的私有静态 constexpr 方法 - Clang bug?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 如何访问模板参数自己的模板参数?
- 将矩阵乘以我自己的输入的向量
- 为自己的流类重载插入操作符
- 重载操作符来处理我自己的类作为std类是一个好做法吗?
- 创建了自己的字符串类——重载赋值操作符和析构函数的错误
- 使用我自己的String类和<<操作符
- 在c++中创建自己的操作符
- 我可以添加自己的类型转换操作符,以便能够将c++对象转换为objective C吗?
- 派生对象没有使用自己的操作符=