我有2个C++类,其中一个是另一个(公有继承)的基类。我在这两个操作符中都执行了过载操作符< <。我想要的是使用子类的< <与基类的< <。C++继承“toString”
这可能吗?
我的意思是,假设基类< <超载印刷的“嗨,我的名字是瑞”,我想该子类< <超负荷打印“嗨,我的名字是瑞\ n它的阳光明媚的今天”。
感谢
我有2个C++类,其中一个是另一个(公有继承)的基类。我在这两个操作符中都执行了过载操作符< <。我想要的是使用子类的< <与基类的< <。C++继承“toString”
这可能吗?
我的意思是,假设基类< <超载印刷的“嗨,我的名字是瑞”,我想该子类< <超负荷打印“嗨,我的名字是瑞\ n它的阳光明媚的今天”。
感谢
您可以通过在基类中定义虚成员函数,并从基类的operator <<
调用它,这样做:
struct Base {
virtual string show() {return "Hi, my name is Raul";}
};
struct Derived : public Base {
virtual string show() {return "Hi, my name is Raul, and it's sunny today";}
};
ostream& operator <<(ostream& ostr, const Base& val) {
ostr << val.show();
return ostr;
}
现在的实际调度是虚拟完成,而operator <<
仅用于允许输出的操作符语法(即两个类的实现操作相同,但只需重写虚拟成员函数即可在子类中更改打印逻辑)。
很好的答案,比我的更优雅! – vsoftco 2014-12-08 02:02:51
你的意思是这样吗?
(使用基类的虚函数从重叠子类的函数)
#include <iostream>
#include <string>
using namespace std;
class Base{
public:
virtual string toString()const{
return string("Hi, my name is Rui");
}
};
class Sub: public Base{
public:
virtual string toString()const{
return Base::toString() + string("\nIt's sunny today");
}
};
//this should work for both Base and Sub
ostream& operator <<(ostream& stream, const Base& b){
return stream<<b.toString();
}
int main(){
Base b;
Sub s;
cout<<"Base print:"<<endl<<b<<endl;
cout<<"Sub print:"<<endl<<s<<endl;
return 0;
}
输出是:
Base print:
Hi, my name is Rui
Sub print:
Hi, my name is Rui
It's sunny today
是的,类似的东西..我是一个java的家伙,所以事实上没有像C++中的东西是令人困惑的xD – nervousDev 2014-12-08 02:23:47
我添加了'operator <<'和'main'函数,并且还设置了'toString( )'为const,所以现在可以编译并按原样运行。 – SHR 2014-12-08 03:00:14
你所寻找的是一个虚拟的toString funtion:
class base{
public:
virtual string toString(){
return string("Hi, my name is Rui");
}
};
class derived:public base{
public:
virtual string toString(){
return string("Hi, my name is Rui\nIt's sunny today");
}
};
OP想要使用基类的toString函数作为子类的toString的一部分 – adam 2014-12-08 02:19:17
你尝试了什么? – quantdev 2014-12-08 01:50:41
我找不到一种方法使其工作... – nervousDev 2014-12-08 01:52:52
@nervousDev:对,但是你试过的那个没有“工作”?你需要展示研究证据。 – 2014-12-08 02:09:51