博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
可以直接调用的纯虚函数
阅读量:4569 次
发布时间:2019-06-08

本文共 1132 字,大约阅读时间需要 3 分钟。

昨天提到了子在构造函数和析构函数中调用虚函数的问题。白天的时候翻了一下《深入理解C++对象模型》,结果还真发现一点儿有趣的东西。

文中如是说:很多C++新手会惊奇的发现纯虚函数竟然可以定义(在声明的基类中定义),并且可以被调用(静态调用)!看来我还是新手啊,废话少说,上代码!

#include 
using namespace std;class Base{ public: Base(){} void callVirFunc(); virtual ~Base(){}; private: virtual void virFunc() = 0;//注意是私有的哦!};class Derived:public Base{ public: Derived(){} private: virtual void virFunc();//这里也是私有的哦!};void Base::virFunc(){ cout<<"Virtual function static defined in Base!"<
callVirFunc(); delete pd; return 0;}

 

运行结果:

:!./pure_virtual_func_testVirtual function defined in Derived!Virtual function static defined in Base!

 

例子中, Base class中的callVirFunc函数分别调用了在Base class中定义的纯虚函数版本和Derived class中的实现版本。神奇吧!

 

其实这个例子是很特殊的哦!它还是反映了另外一个有趣的问题哦!注意!Base class中的callVirFunc函数调用了Derived class中的私有虚函数!它竟然绕过了访问控制机制!对于这个问题,CSDN中的兄弟们进行了激烈的讨论(在这里)。我想说的是,从编译器的角度看,这是完全没有问题的,因为当前对象的类类型是Derived,它的vptr指向Derived的虚函数表。还有一个问题就是,在虚函数表中并没有访问控制信息,所以此时调用虚函数的时候,拿到的当然就是Derived的版本并正确执行喽。这种做法确实可以造成一些看起来诡异的程序行为,所以尽量避免这样做吧。如果想让程序更有序,更清晰,在虚函数中调用私有的本地函数是比较好的方式。

转载于:https://www.cnblogs.com/chezxiaoqiang/archive/2012/09/18/2692378.html

你可能感兴趣的文章
vagrant The specified host network collides with a non-hostonly network!
查看>>
0x59 单调队列优化DP
查看>>
mysql中的union用法
查看>>
利用python爬取龙虎榜数据及后续分析
查看>>
Git和GitHub使用总结
查看>>
php array_multisort对数据库结果多个字段进行排序
查看>>
关于大型网站技术演进的思考(十六)--网站静态化处理—前后端分离—下(8)...
查看>>
Python中dict详解
查看>>
[LeetCode][JavaScript]House Robber
查看>>
java经典算法四十题
查看>>
(转载) MTK flash
查看>>
Python 序列化之json、pickle
查看>>
python3 多线程笔记
查看>>
无尽的控件-GridView复合表头
查看>>
Luogu4726 【模板】多项式指数函数(NTT+多项式求逆)
查看>>
e3mall商城的归纳总结2之认识dubbo、zookeeper
查看>>
纯js实现图片上传
查看>>
嵌入式SQL
查看>>
HDOJ(HDU) 2133 What day is it(认识下Java的Calendar类---日期类)
查看>>
甲级1002 A+B for Polynomials (25)
查看>>