2012-04-05 82 views
3

類DVD繼承類媒體,有一個比基類更多的變量。如何調用基類(而不是抽象)重載函數?

我聲明指針:

Media* ptr = new DVD(...); 

我想打印出DVD的內容,所以下面的代碼按預期工作:

ptr->print(cout); 

但僅使用重載< <運營商調用基類print()函數:

cout << *ptr << endl; 

因此它僅打印出ID,而不打印導演的名字。要解決這個問題

一種方法是修改過載< <操作了一下,使其接受指針,所以:

cout << ptr << endl; 

應該工作,但不知何故,我必須找到使cout << *ptr << endl;工作結合的方式預期。

有什麼建議嗎?

事情是我不能做基類(媒體)摘要,因爲我需要在重載ostream操作符中調用它的一個實例,所以基類的指針不能調用派生的重載函數類,它指向。

代碼:

#include <iostream> 
using namespace std; 

class Media{ 
    private: 
     int id; 
    public: 
     Media(int _id) : id(_id) {} 
     virtual ~Media(); 
     virtual void print(ostream &out); 
     friend ostream& operator << (ostream& out, Media aMedia); 
}; 
Media::~Media(){} 

class DVD : public Media { 
    private: 
     string director; 
    public: 
     DVD(int _id, string _director = "unknown") : Media(_id), director(_director) {} 
     ~DVD(); 
     void print(ostream &out); 
}; 
DVD::~DVD(){} 

void Media::print(ostream& out){ 
    out << "ID " << id; 
} 
void DVD::print(ostream& out){ 
    out << "DVD: "; 
    Media::print(out); 
    out << " Directed by " << director; 
} 
ostream& operator << (ostream& out, Media aMedia){ 
    aMedia.print(out); 
    return out; 
} 

int main() { 
    Media *ptr = new DVD(352, "Stephen Spielberg"); 
    ptr->print(cout); // Prints out: "DVD: ID 352 Directed by Stephen Spielberg". Correct! 
    cout << endl; 
    cout << *ptr << endl; //Prints out: "ID 352" Incorrect! 
} 

回答

1

問題在此聲明ostream& operator << (ostream& out, Media aMedia)。您正在接受參數aMedia通過複製導致對象切片,通過使用引用更改簽名接受它ostream& operator << (ostream& out, const Media& aMedia)

由於切片的,當你做cout << *ptr,一個複製DVD創建Media型的(即DVD切片爲媒體),現在當你調用print,因爲對象的類型是Media呼叫轉到到Media::print。你可以閱讀更多關於對象切片here

+0

所有的好,我從來沒有明白爲什麼我們應該在重載函數中使用const引用,而不是僅僅使用變量本身,但現在都清楚了。謝謝! – 2012-04-05 10:30:36

1

或引用媒體&傳遞到阿茲馬特< <,這樣會出現虛擬調度。

您正在直接傳遞一個媒體對象,這意味着將創建一個DVD對象的新副本,並且只有DVD的部分將被丟棄,並且只是其媒體部分將以aMedia參數結束。

看到:

ostream& operator << (ostream& out, const Media& aMedia){ 
    aMedia.print(out); 
    return out; 
} 
+1

最好讓它成爲一個常量引用。 – Henrik 2012-04-05 10:18:29

+0

好點,做 – 2012-04-05 10:20:25

+0

所有的好,我從來沒有明白爲什麼我們應該在重載函數中使用const引用,而不是僅僅使用變量本身,但現在都清楚了。 謝謝! – 2012-04-05 10:24:56

相關問題