DVD 类继承了 Media 类,比基类多一个变量。
我声明一个指针:
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!
}