虚基派生 //虚继承

#include <iostream>
using namespace std;
#include <string>
//--------------------------------------
class A
{
public:
int m_ax ;
int m_ay; A();
A(int va,int vy); void show();
};
A::A()
{ }
A::A(int vx,int vy)
{
this->m_ax = vx;
this->m_ay = vy;
}
void A::show()
{
cout<<"A::show "<<endl;
cout<<"A::m_ax = "<<m_ax<<endl;
cout<<"A::m_ay = "<<m_ay<<endl;
}
//--------------------------------------
class B1: virtual public A {
public:
int m_b1x;
B1();
B1(int ax,int ay,int bx); };
B1::B1()
{ } B1::B1(int ax,int ay,int b1x)
{
m_ax = ax;
m_ay = ay;
m_b1x = b1x;
} //---------------------------------------
class B2: virtual public A {
public:
int m_b2x; B2();
B2(int ax,int ay,int b2x); };
B2::B2()
{ } B2::B2(int ax,int ay,int b2x)
{
m_ax = ax;
m_ay = ay;
m_b2x = b2x;
} //-------------------------------------
class C: public B1,public B2 {//虚基继承
public:
int m_cx; C();
C(int ax,int ay,int b1x,int b2x); void show();
};
C::C()
{ } C::C(int ax,int ay,int b1x,int b2x)
{
m_ax = ax;//因为C的上级B1、B2使用了虚基继承A,所以C类中只有一个m_ax,不会产生二义性。
m_ay = ay;
m_b1x = b1x;
m_b2x = b2x;
}
void C::show()
{
cout<<"C::show()"<<endl;
cout<<"m_ax = "<<m_ax<<endl;
cout<<"m_ay = "<<m_ay<<endl;
cout<<"m_b1x = "<<m_b1x<<endl;
cout<<"m_b2x = "<<m_b2x<<endl;
}
//--------------------------------------
int main()
{
C c1( , , , ); c1.show(); //C中实现的show
c1.A::show(); //从A继承下来的show只有一个,以下面这三种方式访问到的都是同一个A::show()
c1.B1::show();
c1.B2::show(); cout<<"addr c1.B1::m_ax = "<<&(c1.B1::m_ax)<<endl;//从A继承下来的m_ax只有一个,这三种方式访问的是同一个m_ax,地址是相同的。
cout<<"addr c1.B2::m_ax = "<<&(c1.B2::m_ax)<<endl;
cout<<"addr c1.A::m_ax = "<<&(c1.A::m_ax)<<endl; cout<<"c1.B1::m_ax = "<<c1.B1::m_ax<<endl;
cout<<"c1.B2::m_ax = "<<c1.B2::m_ax<<endl;
cout<<"c1.A::m_ax = "<<c1.A::m_ax<<endl; B1 b1(,,) ;
cout<<"B1.m_ax = "<<b1.m_ax<<endl;
b1.show();//B虚继承A ,可以不用重写A的方法而直接使用。 while();
return ;
} // C::show()
// m_ax = 1
// m_ay = 2
// m_b1x = 3
// m_b2x = 4
//
// A::show
// A::m_ax = 1
// A::m_ay = 2
//
// A::show
// A::m_ax = 1
// A::m_ay = 2
//
// A::show
// A::m_ax = 1
// A::m_ay = 2
//
// addr c1.B1::m_ax = 0xbfbb43c8 //因为C的上级B1、B2使用了虚基继承A,所以C类中只有一个m_ax,不会产生二义性。
// addr c1.B2::m_ax = 0xbfbb43c8
// addr c1.A::m_ax = 0xbfbb43c8
// c1.B1::m_ax = 1
// c1.B2::m_ax = 1
// c1.A::m_ax = 1
//
// B1.m_ax = 22
// A::show
// A::m_ax = 22
// A::m_ay = 33

参考:华清远见笔记。

c++, 虚基派生 : 共同基类产生的二义性的解决办法的更多相关文章

  1. Eclipse中发布Maven管理的Web项目时找不到类的问题根源和解决办法(转)

    转自:http://blog.csdn.net/lvguanming/article/details/37812579?locationNum=12 写在前面的话 现在是越来越太原讨厌Eclipse这 ...

  2. 编译不通过:提示XXXX不是类或命名空间名 的解决办法

    手动写了一个类,需要引入预编译头stdafx.h.结果编译时提示XXXX不是类或命名空间名. 处理方法:将#include "stdafx.h"放在最前面.

  3. [原创]在使用SDK 23(6.0)版本后org.apache.http相关的类找不到的解决办法

    参考: http://stackoverflow.com/questions/32153318/httpclient-wont-import-in-android-studio http://www. ...

  4. 电脑无法识别U盘(usb类外接设备)的解决办法

    首先分析USB无法识别的硬件原因: 1.BIOS禁用了USB设备.(进入BIOS,将"Enable USB Device"修改为"Enable") 2.USB接 ...

  5. 利用反射将IDataReader读取到实体类中效率低下的解决办法

    最开始使用反射一个类型的各个属性,对气进行赋值的代码如下: public static List<T> ToList<T>(IDataReader reader) { //实例 ...

  6. idea类存在找不到解决办法

    清除idea缓存,

  7. eclipse导入新项目后,运行时找不到主类解决办法

    最近在学习多线程,今天下了一套源码,导入到eclipse里后,随便找了个带main()的类试了一下,找不到主类. 首先想到的解决办法是把工程clean一下,并没有用.去网上找了一个遍终于找到了管用的方 ...

  8. objectARX 关于MFC类向导 无法向此非CCmdTarget派生类添加任何命令 的解决方式

    objectARX 关于MFC类向导 无法向此非CCmdTarget派生类添加任何命令  的解决方式 图文By edata ,转载注明出处 http://www.cnblogs.com/edata 1 ...

  9. 关于COM类工厂80070005和8000401a错误分析及解决办法

    关于COM类工厂80070005和8000401a错误分析及解决办法 看到很多相关的文章,第一次配置配置时没有啥作用,让别人来解决的,可惜不晓得他怎么解决的,当我再次遇到时,不得不硬着头皮去解决. 总 ...

随机推荐

  1. 5.6.3 String类型

    String类型是字符串的对象包装类型,可以像下面这样使用String构造函数来创建. var stringObject = new String("hello world"); ...

  2. mybatis+spring+c3p0+maven+ehcache

    项目截图 pom.xml如下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http: ...

  3. 技术不牛如何才拿到国内IT巨头的Offer

    不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,NOI金牌,开源社区名人,三年级开始写Basic...在跪拜之余我们不禁要想,和这些牛人比,作为绝大部分技 ...

  4. podoWeb极品流氓软件

    用firefox做页面网络性能测试, 打开网页就会发现页面不停的去请求googleapi.com上的jquery Or swfobject.js,页面就此卡住,一直在等待类似这两个请求的返回,知道Ab ...

  5. $.getJSON(url,function success(){})回调函数不起作用

    有个问题好久没有解决,就是: $.getJSON(url,function success(){}) 其中的回调函数,总也不执行. 以前也做过,但那都是CTRL+C,CTRL+V,也没有细想. 目标就 ...

  6. spring注解controller示例

    依赖库 spring 3.0 配置web.xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <w ...

  7. 初试PL/SQL并行编程

    -----------------------------Cryking原创------------------------------ -----------------------转载请注明出处, ...

  8. nyoj-709-异形卵(水题)

    异 形 卵 时间限制:1000 ms  |  内存限制:65535 KB 难度: 描写叙述 我们探索宇宙,是想了解浩瀚星空的奥妙.但我们却非常少意识到宇宙深处藏匿的危急,它们无时无刻不紧盯着我们的地球 ...

  9. STL之queue(单向队列)

    单向队列中的数据是先进先出(First In First Out,FIFO).单向队列一共6个常用函数(front().back().push().pop().empty().size()) #inc ...

  10. [条款36]绝不重新定义继承而来的non-virtual函数

    看下面的两个类的声明代码: class B { public: void mf(); //something to do }; class D : public B { public: void mf ...