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错误分析及解决办法 看到很多相关的文章,第一次配置配置时没有啥作用,让别人来解决的,可惜不晓得他怎么解决的,当我再次遇到时,不得不硬着头皮去解决. 总 ...
随机推荐
- RUP(Rational Unified Process)笔记整理
RUP,统一软件开发过程是一种面向对象且基于网络的程序开发方法论. RUP的思路:Implementing BestPractices ·迭代式开发 在软件开发的早期阶段就想完全.准确的捕获用户的需求 ...
- [cocos2d-x] 让精灵响应触摸 并把方向旋转到相对应的角度
在cocos2d-x里面 想要把一个精灵从原位置移动到用户所触摸到的点 , 并且把精灵的方向旋转相对应的弧度,可以参考一下我的做法 我这里的精灵是用一条鱼, 用户触摸后鱼就移动到所触摸的点, 并且移 ...
- 帝国cms7.0调用出栏目下的东西
打开帝国后台,新建一个栏目,简历一个封面模板为 abc,套用一个封面栏目. [e:loop={"select * from {$dbtbpre}enewsclass where classi ...
- QT实现,通过URL下载文件的接口实现
今天来把坑填上. 具体就是提供一个URL,并通过这个URL下载文件. MyDownloader.h: #ifndef MYDOWNLOADER_H #define MYDOWNLOADER_H cla ...
- IPTABLES 映射问题
今天要做一个新的映射:将内网的一个8090口映射到外网的8087口. 在 /ETC/RC.LOCAL中最后插入: iptables -t nat -A PREROUTING -d outIP -p t ...
- Sicily-1152 回溯算法
一.题意: 走日字,每个位置都有有8种新位置,从起点开始刚好过29步遍历其他位置一遍. 二.代码 // // main.cpp // Sicily-1152 回溯算法 // // Created by ...
- poj 3356 AGTC(线性dp)
题目链接:http://poj.org/problem?id=3356 思路分析:题目为经典的编辑距离问题,其实质为动态规划问题: 编辑距离问题定义:给定一个字符串source,可以对其进行复制,替换 ...
- poj 2155
题目链接 二维树状数组 给出矩阵左上角和右下角坐标,矩阵里的元素 1变0 ,0 变1,然后给出询问,问某个点是多少. 树状数组下标不能为0 二维的每次更新都是从(1,1)到(x,y) 要更新(x1,y ...
- Sass入门——基本特性-基础
本文来自慕课网大漠 声明变量 三个部分:1.声明变量的符号"$"2.变量名称3.赋予变量的值 $brand-primary : darken(#428bca, 6.5%) !def ...
- Android Bug 记录
1.Unable to resolve target 'android-5' 无法解析目标 ' 安卓系统-5' Unable to resolve target 'Google Inc.:G ...