首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

生手 求解释代码 多态

2012-11-04 
新手 求解释代码 多态C/C++ codeclass A{public:virtual void showA() {coutits A1endl}void show

新手 求解释代码 多态

C/C++ code
class A{public:    virtual void showA() {cout<<"it's A1"<<endl;}    void showB()  {cout<< "it's B1"<<endl;}};class B:public A{public:    void showA() {cout<<"it's A2"<<endl;}    void showB() {cout<<"it's B2"<<endl;}};int main(int argc, char* argv[]){    A *a = new A;    B *b = (B*) a;    b->showA();    b->showB();    return 0;}



求输出和解释


[解决办法]
找本C++基础的书籍,关于虚函数实现多态的章节,认真地看一遍。
[解决办法]
引用:

给你两个个链接吧,感觉都比较好。

第一个是从对象模型角度上,对使用虚拟继承的对象的内存布局进行了说明(注:解释内存布局时时使用的是vc编译器,其它编译器可能稍有不同,但基本原理都是一致的,理解就是了)。上面有非常清晰的说明(简洁的代码和图示),感谢 iTech 大牛。

http://www.cnblogs.com/itech/archive/2009/02/27/1399996.html

看完该链接中的内容后,楼主的问题就可以解决了。

第二个链接对虚拟继承的实现原理进行了比较清晰的阐述,总结的比较好。后面的举的例子就不用看了,没有第一个链接中的例子清晰吧。 感谢 jinri1234 的总结。

http://blog.csdn.net/jinri1234/article/details/5702011

希望楼主对虚拟继承有比较深刻的理解。Good Luck!

[解决办法]
it's A1
it's B2
第一为A1是因为new出来的是A,A的默认构造函数会把vptr初始化为A的vtable B *b = (B*) a;不会改变a地址的任何东西 b.showA();通过vptr找到vtable里对应的虚函数,而vtable实际上为A的vtable,所以输出it's A1

第二是因为传给this指针的是B*,所以它就找到B里面的showB,输出it's B2

推荐看C++对象模型

C++菜鸟,如有不对,欢迎指正

热点排行