关于C++对象模型的思考
来源:互联网 发布:淘宝海外开店 编辑:程序博客网 时间:2024/05/16 09:11
一、我们首先看一个例子,一个孙子类继承了两个父亲类,两个父亲类同时继承同一个爷爷类。
#include <iostream>using namespace std; class Parent{public: int p_; // p将会被所有的子类继承,也将是二义性的根源 Parent(int p):p_(p) { cout<<"Parent ..."<<endl; }}; class Child1 :virtual public Parent{public: Child1(int p) : Parent(p) { cout<<"Child1 ..."<<endl; p_ =3; // p在子类Child1中被赋值为12 } virtual void display(){cout<<"Child1 display"<<endl;}};class Child2 :virtual public Parent{public: Child2(int p) : Parent(p) { cout<<"Child2 ..."<<endl; p_=5; // p在子类Child2中被赋值为13 }virtual void display(){cout <<"Child2 display"<<endl;}}; class GrandChild : public Child1, public Child2{public: int grandchild; // p显然也存在于GrandChild中,但是到底是12,还是13呢?这就产生了二义性 GrandChild(int p) : Child2(p),Child1(p),Parent(p) { cout<<"GrandChild ..."<<endl; grandchild = 14; } virtual void display(){cout<<"GrandChild display"<<endl;}}; int main(void){ Child1* pGC = new GrandChild(4); pGC->display(); delete pGC; return 0;}
结果为:
Parent ...Child1 ...Child2 ...GrandChild ...GrandChild display
如果把Child1* pGC = new GrandChild(4);修改成Child2* pGC = new GrandChild(4);那么程序就会报错。
如果把class GrandChild : public Child1, public Child2修改成class GrandChild : public Child2, public Child1。
那么Child2* pGC = new GrandChild(4);执行正常。Child1* pGC = new GrandChild(4);执行错误。
为什么,我也不知道,从这个例子让我感觉到学习C++对象模型的重要性。如果知道C++对象模型,我认为上面的问题就迎刃而解了。
0 0
- 关于C++对象模型的思考
- 关于C的思考
- 关于C的思考
- 关于C的思考
- 关于C的思考
- Java 关于对象的思考
- 关于面向对象的思考
- 对JavaScript的对象模型的思考
- C++::几道关于对象模型的经典题
- 关于恶意经销商模型的一些思考
- 关于产品对象描述的思考
- 关于面向对象的一些思考
- 关于面向对象设计的一些思考
- 关于对象之间通信的一点思考
- 关于对象之间通信的一点思考
- 关于面向对象编程的一点思考
- 一些关于面向对象的思考
- C/C++的对象模型
- 标准wordcount
- JavaEE程序员必读图书大推
- url重定向
- Leetcode--Best Time to Buy and Sell Stock III
- iOS7状态栏默认文字颜色修改
- 关于C++对象模型的思考
- 安卓应用《撕掉她的衣服》简化版
- ImageView获取网络图片
- WIN 7 SVN修改用户名与密码
- Ubuntu安装过程之磁盘分区图文教程
- IE开调试模式才能正确调用绑定的js函数
- 无线移动网络在医疗卫生行业的应用
- Hive学习之Hive CLI
- net MVC 3.0 1