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