c++, 虚基派生 : 共同基类产生的二义性的解决办法
虚基派生 //虚继承

#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++, 虚基派生 : 共同基类产生的二义性的解决办法的更多相关文章
- Eclipse中发布Maven管理的Web项目时找不到类的问题根源和解决办法(转)
转自:http://blog.csdn.net/lvguanming/article/details/37812579?locationNum=12 写在前面的话 现在是越来越太原讨厌Eclipse这 ...
- 编译不通过:提示XXXX不是类或命名空间名 的解决办法
手动写了一个类,需要引入预编译头stdafx.h.结果编译时提示XXXX不是类或命名空间名. 处理方法:将#include "stdafx.h"放在最前面.
- [原创]在使用SDK 23(6.0)版本后org.apache.http相关的类找不到的解决办法
参考: http://stackoverflow.com/questions/32153318/httpclient-wont-import-in-android-studio http://www. ...
- 电脑无法识别U盘(usb类外接设备)的解决办法
首先分析USB无法识别的硬件原因: 1.BIOS禁用了USB设备.(进入BIOS,将"Enable USB Device"修改为"Enable") 2.USB接 ...
- 利用反射将IDataReader读取到实体类中效率低下的解决办法
最开始使用反射一个类型的各个属性,对气进行赋值的代码如下: public static List<T> ToList<T>(IDataReader reader) { //实例 ...
- idea类存在找不到解决办法
清除idea缓存,
- eclipse导入新项目后,运行时找不到主类解决办法
最近在学习多线程,今天下了一套源码,导入到eclipse里后,随便找了个带main()的类试了一下,找不到主类. 首先想到的解决办法是把工程clean一下,并没有用.去网上找了一个遍终于找到了管用的方 ...
- objectARX 关于MFC类向导 无法向此非CCmdTarget派生类添加任何命令 的解决方式
objectARX 关于MFC类向导 无法向此非CCmdTarget派生类添加任何命令 的解决方式 图文By edata ,转载注明出处 http://www.cnblogs.com/edata 1 ...
- 关于COM类工厂80070005和8000401a错误分析及解决办法
关于COM类工厂80070005和8000401a错误分析及解决办法 看到很多相关的文章,第一次配置配置时没有啥作用,让别人来解决的,可惜不晓得他怎么解决的,当我再次遇到时,不得不硬着头皮去解决. 总 ...
随机推荐
- BZOJ 1927: [Sdoi2010]星际竞速(最小费用最大流)
拆点,费用流... ----------------------------------------------------------------------------- #include< ...
- Eclipse 实现关键字自动补全功能 (转)
一般默认情况下,Eclipse ,MyEclipse 的代码提示功能是比Microsoft Visual Studio的差很多的,主要是Eclipse ,MyEclipse本身有很多选项是默认关闭的, ...
- iOS 支持arm_64 和 x86_64 的OpenSSL 静态库(libcrypto.a, libssl.a)
下载链接
- [LeetCode]题解(python):075-Sort Colors
题目来源: https://leetcode.com/problems/sort-colors/ 题意分析: 给定n个颜色,红色,白色和蓝色.分别用0,1,2代替,将这些颜色排序,0在1前,1在2前. ...
- 想精度高,可以考虑用c语言中的函数gettimeofday
大家好: 在 win32 + bcb 时, 有个 GetTickCount() 返回第统启动到现在的 tick, 单位 ms.请问在 Linux + qt5 怎样实现呢? 如果用 QDateTime ...
- VS2010/MFC说明
此栏目大多数内容转自鸡啄米http://www.jizhuomi.com/ 方便使用对其内容做了少量修改,仅是个人收藏使用,不做其它用途.
- 高可用mysql集群搭建
对web系统来说,瓶颈大多在数据库和磁盘IO上面,而不是服务器的计算能力.对于系统伸缩性我们一般有2种解决方案,scale-up(纵向扩展)和scale-out(横向扩展).前者如扩内存,增加单机性能 ...
- 大数据时代之hadoop(五):hadoop 分布式计算框架(MapReduce)
大数据时代之hadoop(一):hadoop安装 大数据时代之hadoop(二):hadoop脚本解析 大数据时代之hadoop(三):hadoop数据流(生命周期) 大数据时代之hadoop(四): ...
- HDU4099(斐波那契数列与字典树)
题目:Revenge of Fibonacci 题意:给出斐波那契数列的前k位,k不超过40,找出最小的正整数n,满足F(n)的前k位与给定数的前k位相同,斐波那契数列的项数不超过100000. 解析 ...
- jz2440不能成功地启动文件系统, Failed to execute /linuxrc.
文件系统加载失败,错误信息提示: VFS: Mounted root (nfs filesystem). Freeing init memory: 140K Failed to ex ...