面试题目
来源:互联网 发布:java 框架 编辑:程序博客网 时间:2024/04/29 05:50
C++中静态成员函数能不能同时也是虚函数? 分析:答案是不能。调用静态成员函数不要实例。但调用虚函数需要从一个实例中指向虚函数表的指针以得到函数的地址,因此调用虚函数需要一个实例。两者相互矛盾。
运行下列C++代码,输出什么? class A { public: A() { Print(); } virtual void Print() { printf("A is constructed./n"); } }; class B: public A { public: B() { Print(); } virtual void Print() { printf("B is constructed./n"); } }; int _tmain(int argc, _TCHAR* argv[]) { A* pA = new B(); delete pA; return 0; } 答案:先后打印出两行:A is constructed. B is constructed. 调用B的构造函数时,先会调用B的基类及A的构造函数。然后在A的构造函数里调用Print。由于此时实例的类型B的部分还没有构造好,本质上它只是A的一个实例,他的虚函数表指针指向的是类型A的虚函数表。因此此时调用的Print是A::Print,而不是B::Print。接着调用类型B的构造函数,并调用Print。此时已经开始构造B,因此此时调用的Print是B::Print。 同样是调用虚拟函数Print,我们发现在类型A的构造函数中,调用的是A::Print,在B的构造函数中,调用的是B::Print。因此虚函数在构造函数中,已经失去了虚函数的动态绑定特性。
- 面试题目
- 面试题目
- 面试题目
- 面试题目
- 面试题目
- 面试题目
- 面试题目
- 面试题目
- 面试题目
- 面试题目
- 面试题目
- 面试题目
- 面试题目
- 面试题目
- 面试题目
- 面试题目
- 面试题目
- 面试题目
- 调用外部oracle存储过程
- SDL
- 项目经理要如何看待技术?
- 项目管理中,最难管的是什么?
- 说说这几天的悲剧事吧(2011/05/26)
- 面试题目
- start_kernel->mem_init
- ASPXGridView footer 中显示汇总信息【Devexpress】
- Excel 中超链接的批量处理
- 一位 ALS患者在生命走到尽头前用脚贡献了最后一个代码补丁
- 类与类之间的关系
- 关于javascript获取当前对象的问题
- over()用法
- 自己没事重写了array_chunk函数,纯属娱乐