运算符<<重载继承,为什么我从基类而不是子类获得输入?
Operator << overload inheritance, why I got input from base class, instead of child class?
我有一个类,我们称它为A
,它只有一个字段aa
。我有另一个类B
,它继承了类A
,它没有aa
字段,也有自己的字段bb
。现在,我为这两个类重载了operator <<
(cout
)。我试着使用多态射,但似乎多态射不能正确地与运算符一起工作。当使用运算符cout
显示对象obj
时,我的代码只显示aa
字段。
我的意思是,我总是需要添加virtual
单词来重载子类中基类的函数吗?如果是这样的话,我应该如何对待运营商,运营商不能是虚拟的。。。
#include <iostream>
#include <ostream>
using namespace std;
class A
{
protected :
int aa;
public:
A(int aa) {this->aa = aa;}
~A(){}
friend ostream &operator<<(ostream &os, const A& obj);
virtual void show() {cout << "a = " << aa << "n"; }
};
ostream &operator<<(ostream &os, const A& obj)
{
for(int i=0; i<80; i++)
os << "-";
os << "n";
os << "a = " << obj.aa << "n";
for(int i=0; i<80; i++)
os << "-";
os << "n";
return os;
}
class B : public A
{
private :
int bb;
public:
B(int aa, int bb) : A(aa) {this->bb = bb;}
~B(){}
friend ostream &operator<<(ostream &os, const B& obj);
void show() {cout << "a = " << aa << "n"; cout << "b = " << bb << "n";}
};
ostream &operator<<(ostream &os, const B& obj)
{
for(int i=0; i<80; i++)
os << "-";
os << "n";
os << "a = " << obj.aa << "n";
os << "b = " << obj.bb << "n";
for(int i=0; i<80; i++)
os << "-";
os << "n";
return os;
}
int main()
{
A *obj = new B(2,3);
cout << *obj;
obj->show();
delete obj;
return 0;
}
我的意思是,我总是需要添加虚拟单词来重载子类中基类的函数吗?如果是这样的话,我应该如何对待运营商,运营商不能是虚拟的。。。
当然可以。但只有成员函数可以是虚拟的,并且这些运算符不是成员函数,它们是全局函数。
在这种情况下,不能使它们成为成员函数(因为第一个参数不是类的实例)。但你可以创建一个虚拟成员函数,并让运营商称之为:
class A
{
protected:
virtual void print(ostream &);
public:
friend ostream &operator<<(ostream &os, const A& obj);
// ... other stuff ...
};
ostream &operator<<(ostream &os, const A& obj)
{
obj.print(os);
return os;
}
然后覆盖CCD_ 13而不是CCD_。
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 将子类方法声明为基类的友元
- C++子类共享变量?
- 如何检查模板专用化是否是基本模板的子类?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 如何在C++子类中访问父类的私有变量
- 将父类的子类的数据复制到具有相同父类的另一个类