[C++] 纯文本查看 复制代码 #include <iostream> using namespace std ; class A { public: virtual void show() { cout << "Show in A" << endl ; } } ; class B { public: virtual void matrix() { cout << "matrix" << endl ; } virtual void show() { cout << "Show in B" << endl ; } } ; int main() { // // Guess what will be printed before you run it // And why ? // A *p = (A *)(new B) ; p->show() ; return 0 ; } 运行前猜猜结果?? |
[技术| 编程·课件·Linux] 【面试题】C++虚函数的一个有意思的小代码
X1n4n
· 发布于 2012-11-14 10:28
· 1462 次阅读
转载文章时务必注明原作者及原始链接,并注明「发表于 软院网 RuanYuan.Net 」,并不得对作品进行修改。
原来猜是“Show in B",后来试了一下是”matrix“就知道自己想的不对了。 然后查了一下虚函数的使用,编译器在处理虚函数时,是对每个对象添加一个隐藏成员,隐藏成员中保存了一个指向函数地址数组的指针。这样一说就明白了。 p是一个A类型的指针对象,所以p->show指向的是虚函数地址数组的首地址,但是new B也就是说这个说p->show指向的是B类虚函数地址数组的首地址,从B类的定义可以知道,首地址存的是matrix()虚函数,所以会执行cout << "matrix" << endl ; |
点评
隐藏成员说明白点就是VTABLE,是一个指向虚函数组的地址,所以包含虚函数的类的大小,都会多出4个字节,就是这个指针。这个题有意思哈哈
楼上和楼上的点评都对了~~哈 就是 vtable ... 那么我再追加一问: 假设 B 类的定义中是这样的: class B : public A { ..... 其余全部一样,问结果是什么样的? 再从vtable的角度考虑怎么解释? 回答了这个我想您就会理解多态究竟怎么实现的。。。 欢迎各位童鞋踊跃抢答啊~ |
点评
楼主相关话题