DVD类继承了Media类,比基类多了一个变量。
我声明一个指针:
Media* ptr = new DVD(...);
我想打印出 DVD 的内容,因此以下代码可以按预期工作:
ptr->print(cout);
但是使用重载的
cout << *ptr << endl;
所以它只打印出 ID,而不打印导演的姓名。
解决这个问题的一种方法是稍微修改重载
cout << ptr << endl;
应该可以,但不知何故我必须找到方法cout << *ptr << endl;
按预期工作。
有什么建议吗?
问题是我无法使基类(Media)抽象,因为我需要在重载 ostream 运算符中调用它的实例,因此基类的指针无法调用派生类的重载函数,它是指向。
Code:
#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!
}
问题出在这个声明中ostream& operator << (ostream& out, Media aMedia)
。您正在接受该参数aMedia
通过导致对象切片的复制,通过将签名更改为使用引用来接受它ostream& operator << (ostream& out, const Media& aMedia)
.
因为当你这样做时切片cout << *ptr
, a copy of the DVD
是由类型创建的Media
(即 DVD 被切片到媒体),现在当您调用print
因为对象的类型是Media
呼叫转到Media::print
。您可以阅读有关对象切片的更多信息here https://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)