2017-05-18 126 views
-2

我使用C++。調用父操作符<< C++

我試圖重寫opeator < <如下(H文件):

friend ostream& operator<<(std::ostream& os, const Worker& obj); 

.cpp的:

ostream & operator<<(std::ostream & os, const Worker & obj) 
{ 
    return os << "First Name: " << obj.GetFirstName() << ", Last Name: " << obj.GetLastName() << " ,ID: " << obj.GetID() << ", WorkPlace: " << obj._workPlace << endl; 
} 

使用:

Person *w2 = new Worker("First Name", "Last Name", "123456789", "String"); 

cout << w2; 

但運營商< <不叫。

什麼是錯誤?

謝謝!

+2

你想'cout << * w2;'。 – songyuanyao

+0

您提供'Person *'而不是'Person'。 –

+1

避免使用指針和'new'。 –

回答

0

的你std::cout << w2;代替std::cout << *w2;錯誤隱藏着更大的問題:你想通過覆蓋使用多態(致電母公司運營商< <),但是,這不是重載,但超載,因此即使Person指針實際指向Worker對象,friend ostream& operator<<(std::ostream& os, const Worker& obj)也不會被調用Person

多態性解決方案是爲基類調用operator<<,該基類調用可由派生類重寫的虛函數。

struct Base 
{ 
    virtual std::string toString() { return "Base"; } 
} 

struct Derived: Base 
{ 
    virtual std::string toString() { return "Derived"; } 
} 

ostream & operator<<(std::ostream & os, const Base & obj) 
{ 
    return os << obj.toString() << endl; 
} 
1

w2是指向Person對象的指針,而您的operator<<需要const引用。你可以寫另一個<<運營商,需要一個Person*或使用

cout << *w2; 
0

operator<<不叫。

什麼是錯誤?

因爲你傳遞了一個指針(例如一個地址),這就是你的輸出結果。

既然你有operator<<Worker,你必須做這樣說:

Worker *w2 = new Worker("First Name", "Last Name", "123456789", "String"); 
cout << *w2; 

或者,你可以從Person如果你確信實際對象是Worker轉換回Worker

Person *w2 = new Worker("First Name", "Last Name", "123456789", "String"); 
cout << *(Worker*)w2; 
0

這不是重寫;你重寫虛擬成員函數。這是重載和調用的函數是在編譯時從變量的類型確定的,而不是從運行時的對象類型確定的。

所以假設Worker繼承Person,即使使用*w2將無法​​正常工作,因爲這是一個Person&,而不是一個Worker&

在基類中添加一個虛擬輸出函數並覆蓋它,並將父操作符替換爲僅調用此函數的操作符。

class Person 
{ 
    public: 
    // ... 
     virtual void write(std::ostream& os); 
    }; 

std::ostream& operator<<(std::ostream& os, const Person& p) 
{ 
    p.write(os); 
    return os; 
} 

class Worker : public Person 
{ 
    public: 
    // ... 
     void write(std::ostream& os) override; 
}; 

你不需要任何其他的操作符,除了基類。