2014-12-08 3 views
0

У меня есть 2 класса C++, где один является базовым классом другого (public inheritance). У меня есть перегрузка оператора < <. Я хочу использовать < < подкласса с базовым классом < <.C++ Inheritance "toString"

Это возможно?

Я имею в виду, представьте, что базовый класс < < от перегрузки принт «Привет, меня зовут Жуй», и я хочу, чтобы к югу от класса < < перегрузки печатает «Привет, меня зовут солнечный сегодня Руи \ Nit в».

Благодаря

+3

Что вы попробовали? – quantdev

+0

Я не мог найти способ заставить его работать ... – nervousDev

+3

@nervousDev: Правильно, но что вы попробовали, это не «работало»? Вам нужно показать доказательства исследований. –

ответ

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 << используется только для того, чтобы разрешить синтаксис оператора для вывода (т.е. реализация os одинакова для обоих классов, но логика печати может быть изменена в подклассе просто путем переопределения виртуальной функции-члена).

+0

хороший ответ, более элегантный, чем мой! – vsoftco

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

+0

Я добавил 'operator <<' и 'main', а также установил' toString () 'to const, поэтому теперь его можно скомпилировать и запустить как есть. – SHR

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