gpt4 book ai didi

c++ - 如何从基类(非抽象类)调用重载函数?

转载 作者:太空狗 更新时间:2023-10-29 21:48:47 26 4
gpt4 key购买 nike

DVD类继承Media类,比基类多一个变量。

我声明一个指针:

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

我想打印出 DVD 的内容,所以下面的代码可以正常工作:

ptr->print(cout);

但是使用重载的 << 运算符只会调用基类的 print() 函数:

cout << *ptr << endl;

所以它只打印出 ID,而不是导演的名字。

解决这个问题的一种方法是稍微修改重载 << 运算符,使其接受指针,因此:

cout << ptr << endl;

应该可以,但我必须找到制作 cout << *ptr << endl; 的方法按预期工作。

有什么建议吗?

问题是我不能使基类 (Media) 抽象,因为我需要在重载 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!
}

最佳答案

问题出在声明中 ostream& operator << (ostream& out, Media aMedia) .您正在接受参数 aMedia通过导致对象切片的复制,通过将签名更改为 ostream& operator << (ostream& out, const Media& aMedia) 使用引用来接受它.

因为当你做 cout << *ptr 时切片, DVD拷贝创建的类型为 Media (即 DVD 被切片到媒体),现在当您调用 print 时因为对象的类型是 Media调用转到 Media::print .您可以阅读有关对象切片的更多信息 here .

关于c++ - 如何从基类(非抽象类)调用重载函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10026637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com