#include "stdafx.h"
//
//****************多继承、虚继承*****************//二义性
//
//类CBase
class CBase
{
public:
CBase() :base(10)
{
};
~CBase()
{
};
void fun()
{
std::cout << "CBase:a " << base << endl;
}
public:
int base;
};
//类CChildA
class CChildA: virtual public CBase
{
public:
CChildA():a(11)
{
};
~CChildA()
{
};
void fun()
{
std::cout << "CChildA:base " << base << endl;
std::cout << "CChildA:a " << base << endl;
}
public:
int a;
};
//类CChildB
class CChildB: virtual public CBase
{
public:
CChildB():b(12)
{
};
~CChildB()
{
};
void fun()
{
std::cout << "CChildB:base " << base << endl;
std::cout << "CChildB:b " << b << endl;
}
public:
int b;
};
//类CChildC,产生二义性
class CChildC:public CChildA, public CChildB
{
public:
CChildC() :c(13),base(12)
{
};
~CChildC()
{
};
void fun()
{
std::cout << "CChildC:base " << /*CBase::*/base << endl; //二义性位置,解决:1、类限定 CChildA::base 2、A、B继承加虚virtual解决(只有一份数据)
std::cout << "CChildC:a " << a << endl;
std::cout << "CChildC:b " << b << endl;
std::cout << "CChildC:c " << c << endl;
}
public:
int c;
int base; //虚继承在内存中保留一份成员数据,子类同名不会覆盖,多一份数据,输出时不加限定会输出子类同名数据
};
//
//****************run函数:测试本文件内功能****************//
//
static void run()
{
CChildC Child;
Child.fun(); //如果不是虚继承,会产生二义性,编译不会通过,成员数据和函数(包括虚函数)是一样的;产生二义性的地方,编译器都不会通过
}
int main()
{
run();
system("pause");
return 0;
}
12-20
1031