2014-12-08 110 views
0

我有2个C++类,其中一个是另一个(公有继承)的基类。我在这两个操作符中都执行了过载操作符< <。我想要的是使用子类的< <与基类的< <。C++继承“toString”

这可能吗?

我的意思是,假设基类< <超载印刷的“嗨,我的名字是瑞”,我想该子类< <超负荷打印“嗨,我的名字是瑞\ n它的阳光明媚的今天”。

感谢

+3

你尝试了什么? – quantdev 2014-12-08 01:50:41

+0

我找不到一种方法使其工作... – nervousDev 2014-12-08 01:52:52

+3

@nervousDev:对,但是你试过的那个没有“工作”?你需要展示研究证据。 – 2014-12-08 02:09:51

回答

2

您可以通过在基类中定义虚成员函数,并从基类的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 <<仅用于允许输出的操作符语法(即两个类的实现操作相同,但只需重写虚拟成员函数即可在子类中更改打印逻辑)。

+0

很好的答案,比我的更优雅! – vsoftco 2014-12-08 02:02:51

2

你的意思是这样吗?

(使用基类的虚函数从重叠子类的函数)

#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 
+0

是的,类似的东西..我是一个java的家伙,所以事实上没有像C++中的东西是令人困惑的xD – nervousDev 2014-12-08 02:23:47

+0

我添加了'operator <<'和'main'函数,并且还设置了'toString( )'为const,所以现在可以编译并按原样运行。 – SHR 2014-12-08 03:00:14

0

你所寻找的是一个虚拟的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"); 
    } 
}; 
+0

OP想要使用基类的toString函数作为子类的toString的一部分 – adam 2014-12-08 02:19:17