为什么要使用虚函数和 指针(或是引用)才能实现多态?

本文探讨了C++中虚函数和多态的实现,通过分析编译器如何处理默认构造函数、拷贝构造函数和拷贝赋值操作符,揭示了在对象传递过程中虚指针的行为。实验表明,编译器的默认行为可能导致子类的虚函数表被覆盖,从而影响多态调用。通过对编译器生成代码的分析,作者揭示了这一现象的原因,并提出了一些疑问和后续研究方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

补充:(2016.04.05)

上次使用了g++ -fdump-tree-original test3.cpp 命令看到了编译器补充后的函数是什么样子的,但是没有记录,今天补充下:

   下文中第一main函数的代码使用如上命名编译后生成一个名为:test3.cpp.003t.original的文件。打开文件查看后会发下编译器给补充的default构造函数和copy函数分别如下图所示:




       从图中可以看到,编译器会自动给代码添加默认的构造函数和copy构造函数,同时在此两个构造函数中加入,对 _vptr.shape(指向虚表的,虚指针)赋值,指向Shape类的虚函数表,之所以附带贴上编译器添加的默认构造函数,是为了说明copy构造函数中的虚指针确实是指向Shape类的虚函数表。

       在咱们的例子中,当以shape1,shape2作为OutputShape()函数的参数时,由于OutputShape函数定义时的默认参数为Shape类型,而传进去的参数均为Shape类型的子类,此时会隐式调用Shape类的copy构造函数。而copy构造函数是只对成员变量进行拷贝, 虚指针(_vpyr)指向Shape的虚函数表。所以,输出结构就是……。

       对下文的第二个main函数的代码使用如上命名编译后生成一个名为:test3.cpp.003t.original的文件。打开文件查看后会发下编译器给补充的default构造函数和copy函数之外,还给默认补充了copy assignment operator【注意,上边的代码中并没有生成copy assignment operator函数,《深入理解C++对象模型》中说

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值