我有一个课程,我们称之为A
,它只有一个字段aa
。我有另一个类B
,它继承了类A
,而不是拥有aa
字段,它也有自己的字段bb
。现在,我为这两个类重载了operator <<
(cout
)。我试图使用polimorphism,但似乎polimorphism与运算符不兼容。使用运算符aa
显示对象cout
时,我的代码仅显示obj
字段。
我的意思是,我是否总是需要添加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;
}
答案 0 :(得分:2)
我的意思是,我是否总是需要添加虚拟词来重载子类中基类的函数?如果是这样,我应该如何对运营商做同样的事情,运营商不能虚拟......
当然可以。但只有成员函数可以是虚拟的,而这些运算符不是成员函数 - 它们是全局函数。
在这种情况下,您不能使它们成为成员函数(因为第一个参数不是您的类的实例)。但是你可以创建一个虚拟成员函数并让操作员调用它:
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;
}
然后覆盖print
而不是operator<<
。