菱形继承-3
如果inheritClass_1和inheritClass_2都是虚继承baseClass,然后被inheritClass_3继承(非虚继承)这样就能解决二义性问题。如果inheritClass_1或inheritClass_2只有一个虚继承baseClass,另一个为普通继承,然后被inheritClass_3继承(非虚继承),只有又会这样呢?代码如下:
#include "iostream"
using namespace std;
class baseClass
{
private:
int i;
char c;
public:
virtual void virt_fun1(){ cout << "baseClass virt_fun1" << endl; }
virtual void virt_fun2(){ cout << "baseClass virt_fun2" << endl; }
void comm_fun1(){ cout << "baseClass comm_fun1" << endl; }
void comm_fun2(){ cout << "baseClass comm_fun2" << endl; }
baseClass() { cout << "tihs is baseClass" << endl; }
~baseClass() { cout << "~~ baseClass" << endl; }
};
class inheritClass_1 : public virtual baseClass
{
private:
char c;
public:
virtual void virt_fun1(){ cout << "inheritClass virt_fun1" << endl; }
virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
inheritClass_1() { cout << "tihs is inheritClass_1" << endl; }
~inheritClass_1() { cout << "~~ inheritClass_1" << endl; }
};
class inheritClass_2 : public baseClass
{
private:
char c;
public:
virtual void virt_fun2(){ cout << "inheritClass virt_fun1" << endl; }
virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
inheritClass_2() { cout << "tihs is inheritClass_2" << endl; }
~inheritClass_2() { cout << "~~ inheritClass_2" << endl; }
};
class inheritClass_3 : public inheritClass_1, public inheritClass_2
{
private:
char c;
public:
virtual void virt_fun1(){ cout << "inheritClass virt_fun1" << endl; }
virtual void virt_fun2(){ cout << "inheritClass virt_fun2" << endl; }
virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
inheritClass_3() { cout << "tihs is inheritClass_3" << endl; }
~inheritClass_3() { cout << "~~ inheritClass_3" << endl; }
};
int _tmain(int argc, _TCHAR* argv[])
{
inheritClass_3 a;
return 0;
}
依旧存在二义性,程序执行结果如下:
inheritClass_3占用48字节内存,内存分布如下:
1:由于inheritClass_1为虚继承,所以inheritClass_1的baseClass位于内存最高位
2:由于inheritClass_2为普通继承,所以inheritClass_2的baseClass位于内存低位
3:由于inheritClass_3同时继承于inheritClass_1和inheritClass_2,所以inheritClass_3内存分布如上
菱形继承-4
如果inheritClass_1和inheritClass_2都是虚继承baseClass,然后被inheritClass_3继承(非虚继承)这样就能解决二义性问题。如果inheritClass_1和inheritClass_2都是虚继承baseClass,然后被inheritClass_3同时虚继承,又会如何?
#include "iostream"
using namespace std;
class baseClass
{
private:
int i;
char c;
public:
virtual void virt_fun1(){ cout << "baseClass virt_fun1" << endl; }
virtual void virt_fun2(){ cout << "baseClass virt_fun2" << endl; }
void comm_fun1(){ cout << "baseClass comm_fun1" << endl; }
void comm_fun2(){ cout << "baseClass comm_fun2" << endl; }
baseClass() { cout << "tihs is baseClass" << endl; }
~baseClass() { cout << "~~ baseClass" << endl; }
};
class inheritClass_1 : public virtual baseClass
{
private:
char c;
public:
virtual void virt_fun1(){ cout << "inheritClass virt_fun1" << endl; }
virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
inheritClass_1() { cout << "tihs is inheritClass_1" << endl; }
~inheritClass_1() { cout << "~~ inheritClass_1" << endl; }
};
class inheritClass_2 : public virtual baseClass
{
private:
char c;
public:
virtual void virt_fun2(){ cout << "inheritClass virt_fun1" << endl; }
virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
inheritClass_2() { cout << "tihs is inheritClass_2" << endl; }
~inheritClass_2() { cout << "~~ inheritClass_2" << endl; }
};
class inheritClass_3 : public virtual inheritClass_1, public virtual inheritClass_2
{
private:
char c;
public:
virtual void virt_fun1(){ cout << "inheritClass virt_fun1" << endl; }
virtual void virt_fun2(){ cout << "inheritClass virt_fun2" << endl; }
virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
inheritClass_3() { cout << "tihs is inheritClass_3" << endl; }
~inheritClass_3() { cout << "~~ inheritClass_3" << endl; }
};
int _tmain(int argc, _TCHAR* argv[])
{
inheritClass_3 a;
return 0;
}
此时也没有问题,程序运行结果如下:
inheritClass_3占用56字节内存,内存分布如下:
从内存分布看:
1:由于inheritClass_3虚继承inheritClass_1和inheritClass_2,所以inheritClass_3的成员位于最低地址处
2:疑问,为何baseClass的地址低于inheritClass_1和inheritClass_2呢?
菱形继承-5
如果inheritClass_1和inheritClass_2都是虚继承baseClass,然后被inheritClass_3虚继承其中一个,又会怎样呢?
#include "iostream"
using namespace std;
class baseClass
{
private:
int i;
char c;
public:
virtual void virt_fun1(){ cout << "baseClass virt_fun1" << endl; }
virtual void virt_fun2(){ cout << "baseClass virt_fun2" << endl; }
void comm_fun1(){ cout << "baseClass comm_fun1" << endl; }
void comm_fun2(){ cout << "baseClass comm_fun2" << endl; }
baseClass() { cout << "tihs is baseClass" << endl; }
~baseClass() { cout << "~~ baseClass" << endl; }
};
class inheritClass_1 : public virtual baseClass
{
private:
char c;
public:
virtual void virt_fun1(){ cout << "inheritClass virt_fun1" << endl; }
virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
inheritClass_1() { cout << "tihs is inheritClass_1" << endl; }
~inheritClass_1() { cout << "~~ inheritClass_1" << endl; }
};
class inheritClass_2 : public virtual baseClass
{
private:
char c;
public:
virtual void virt_fun2(){ cout << "inheritClass virt_fun1" << endl; }
virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
inheritClass_2() { cout << "tihs is inheritClass_2" << endl; }
~inheritClass_2() { cout << "~~ inheritClass_2" << endl; }
};
class inheritClass_3 : public virtual inheritClass_1, public inheritClass_2
{
private:
char c;
public:
virtual void virt_fun1(){ cout << "inheritClass virt_fun1" << endl; }
virtual void virt_fun2(){ cout << "inheritClass virt_fun2" << endl; }
virtual void virt_fun3(){ cout << "inheritClass virt_fun2" << endl; }
inheritClass_3() { cout << "tihs is inheritClass_3" << endl; }
~inheritClass_3() { cout << "~~ inheritClass_3" << endl; }
};
int _tmain(int argc, _TCHAR* argv[])
{
inheritClass_3 a;
return 0;
}
依旧没有问题,程序执行如下:
inheritClass_3占用48字节内存,内存分布如下:
从内存分布可以看出:
1:非虚继(inheritClass_2)的地址低于虚继承(inheritClass_1)的地址
2:非虚继承与虚继承同时存在时,派生类的成员(inheritClass_3)位于最高位(非虚继承导致)