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错误分析及解决办法 看到很多相关的文章,第一次配置配置时没有啥作用,让别人来解决的,可惜不晓得他怎么解决的,当我再次遇到时,不得不硬着头皮去解决. 总 ...
随机推荐
- XML读写文件辅助类
/// <summary> /// 历史下载记录xml文件操作 /// </summary> public class XMLHelper { private string x ...
- 一周学会Mootools 1.4中文教程:(2)函数
温故: 透过对上一节课的学习,相信大家对mt的选择器应该有了一定的认识了,我再放几个小示例让大家对选择器的复杂应用有所了解: <!DOCTYPE html PUBLIC "-//W3C ...
- python初探-collections容器数据类型
collections容器数据类型是对基本数据类型的补充,简单介绍下计数器.有序字典.默认字典.可命名元祖.队列. 计数器(Counter) Counter是对字典类型的补充,用于追踪值得出现次数 c ...
- [转]android Handler使用
转 http://blog.csdn.net/new_abc/article/details/8184634 不过这个我看不懂 不知道为什么i的值可以接着增长... package com.examp ...
- 泛型 "new的性能"
完美的.net泛型也有特定的性能黑点?追根问底并且改善这个性能问题 完美的.net真泛型真的完美吗 码C#多年,不求甚解觉得泛型就是传说中那么完美,性能也是超级好,不错,在绝大部分场景下泛型表现简直可 ...
- [置顶] 使用mongofiles操作GridFS
使用mongofiles操作GridFS GridFS描述: GridFS,看起来像一种文件系统,其实是一种数据库用法.主要用来在数据库中存储二进制大文件.可以统一用数据库处理数据,而无需借助外部的文 ...
- CSS+DIV标签命名规范 搜索引擎最喜欢
搜索引擎优化(seo)有很多工作要做,其中对代码的优化是一个很关键的步骤.为了更加符合SEO的规范,下面是目前流行的CSS+DIV的命名规则: 登录条:loginBar 标志:logo 侧栏:si ...
- DevExpress ASP.NET 使用经验谈(4)-CriteriaOperator的使用
上一节中,我们已经介绍了,使用CriteriaOperator表达式,获取对象数据. CriteriaOperator criteria = CriteriaOperator.Parse(" ...
- bootstrap基础样式使用
<small> 为了给段落添加强调文本,则可以添加 class="lead" <small>本行内容是在标签内</small><br> ...
- new[] class deconstructor
Class class(); Class *class1=new class; class1=&class; delete class1; // Assert 指针指向的是一个栈中的对象, ...