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

2024-02-17

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(使用前将#替换为@)

如何从基类(非抽象类)调用重载函数? 的相关文章

随机推荐

  • 确保类型在 Go 编译时实现接口

    如何确保类型在编译时实现接口 执行此操作的典型方法是无法分配该类型的支持接口 但是我有几种类型只能动态转换 在运行时 这会生成非常粗暴的错误消息 而不会为编译时错误提供更好的诊断 在运行时发现我期望支持接口的类型实际上并不支持接口 这也是非
  • 如何将大小为 X 的 Java 集合分解为 X/Y 集合?

    我有一个 Java Set 特别是 HashSet 假设它的大小为 10k 如何将其分成 5 套 每套尺寸为 2k Guava https github com google guava有用于划分 Iterable 类的库 这可迭代对象 h
  • PyGObject GTK+ 3 - 文档?

    PyGObject 似乎没有真正的文档 本教程 http python gtk 3 tutorial readthedocs org en latest index html已经很接近了 我整个早上都在努力寻找对被接受的论点的描述Gtk W
  • ANTLR4 中是否有相当于“片段”标记的解析器?

    有没有办法告诉 ANTLR4 内联解析器规则 拥有这样的功能似乎是合理的 读完关于 ANTLR 的书后 权威的 ANTLR 4 参考 我还没有发现这种可能性 但是这四年可能已经发生了变化 既然这本书已经出版了 所以我想最好在这里问一下 考虑
  • 如何使用 tf.train.MonitoredTrainingSession 仅恢复某些变量

    如何告诉 tf train MonitoredTrainingSession 仅恢复变量的子集 并对其余变量执行初始化 从 cifar10 教程开始 https github com tensorflow models blob maste
  • 我可以使用 jQuery 淡入背景图像(CSS:background-image)吗?

    我有一个div包含文本和背景图像的元素 通过 CSS 属性设置background image 是否可以通过 jQuery 淡入背景图像 div background repeat no repeat background position
  • 使用当前年份将月日('%B %d')日期列解析为日期时间

    我有一个采用以下格式的专栏 Date June 22 June 23 June 24 June 25 我正在尝试将此列转换为 pandas df 中的日期时间 格式为 YYYY mm dd 我怎样才能做到这一点 我能够格式化日期并转换为 m
  • 德尔福64位? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 手动将mysql查询结果缓存到txt文件

    有没有办法手动将mysql查询结果缓存到txt文件中 Ex a 1 b 9 c 0 cache filename cached results md5 a b c txt if file exists cache filename resu
  • ebpf - 根据内核版本使用ringbuf和perfbuf

    我正在使用 ebpf 来捕获进程创建 我对内核 5 8 及更高版本使用ringbuf 并希望在同一 ebpf 内核文件中对旧内核使用 perfbuf 有一个关于它的很棒的博客https nakryiko com posts bpf core
  • 无法使用 html 文本框登录

    因为我使用html按钮和文本框来登录 所以我必须在源代码中的javascript中执行后面的代码才能执行后面的代码 无论我使用正确的用户名和密码 Admin 和 123 登录并单击登录按钮 还是不输入任何内容并单击登录按钮 它总是将我重定向
  • 如何删除文件中的第一行?

    我无法搜索特定的字符串 因为它们都非常相似 但我想要一些简单的方法来删除文件中的前 4 行 它们的长度也都是可变的 我考虑过 Perl 这一切似乎比我想象的要难 但如果可能的话 我想用 Perl AWK 或 shell 命令来完成 有人有一
  • 滚动时更改网址

    当我单击导航按钮时 我使用 jQuery 更改 URL 哈希 但是当我使用鼠标滚轮滚动时 URL 不会改变 我怎样才能做到这一点 如何使用它来完成 window history pushState object or string Titl
  • Twitter API 是否可以缩短 url?

    有没有办法从 API 获取缩短的 t co 网址 在通过 API 发布推文之前 我需要缩短一个 url 我应该怎么做 这 这是 Twitter API 支持的还是我必须使用其他一些 像 bit ly 这样的 url 缩短器 除了通过 Twi
  • Rails 验证搜索参数

    我有一个相当安静的 API 但正在努力弄清楚如何干净地实现搜索 我希望能够搜索两个日期时间之间的所有记录 日期时间最多允许相隔 6 小时 目前在我的控制器方法中我有以下内容 required params start time end ti
  • DatatypeProperty、ObjectProperty 和FunctionalProperty 之间有什么区别,什么时候应该使用它们?

    在编写本体时 有几种非常常用的类型 包括 数据类型属性 对象属性 功能特性 反函数性质 前三个看起来像是以一组特定的方式使用 但我发现我对它们的想法受到了我在 FOAF 中的使用方式的挑战 它们分别在什么时候应该使用或者什么时候不应该使用
  • 使用 OpenSSL 相互身份验证始终成功

    我正在使用 openssl 和 zmq 编写服务器和客户端 我的客户端和服务器需要相互身份验证 但我设置后SSL CTX set verify ssl ctx SSL VERIFY FAIL IF NO PEER CERT NULL 在服务
  • 隐式将 List 转换为 List

    我正在使用 Linq to Entities 有一个实体 Order 其中有一个可为空的列 SplOrderID 我查询我的订单列表为 List
  • 无法从 nginx 获取第一个请求的 uid

    我已经在 nginx 中安装了 uid 模块 还添加了与 uid 相关的配置 userid on userid name uid userid expires 365d userid p3p policyref w3c p3p xml CP
  • 如何从基类(非抽象类)调用重载函数?

    DVD类继承了Media类 比基类多了一个变量 我声明一个指针 Media ptr new DVD 我想打印出 DVD 的内容 因此以下代码可以按预期工作 ptr gt print cout 但是使用重载的 cout lt lt ptr l