#include <iostream>
using namespace std;
//虚基类
class Animal
{
public:
int age;
protected:
private:
};
//绵羊类
//class Sheep : public Animal {};
class Sheep : virtual public Animal {};
//骆驼类
//class Camel : public Animal {};
class Camel : virtual public Animal {};
//羊驼 继承绵羊和骆驼
class Alpaca : public Sheep, public Camel {};
void test01()
{
Alpaca alpaca;
alpaca.Sheep::age = 10;
alpaca.Camel::age = 20;
//不明确,造成age二义性,不知道该访问哪一个
//内存空间浪费,继承了一些重复的成员属性
//cout << alpaca.age << endl;
cout << alpaca.Sheep::age << endl;
}
void test02()
{
//采用虚继承:
//当发生虚继承后,Sheep和Camel类中会继承vbptr指针(虚基类指针)指向一个虚基表vbtable
//虚基表中记录了偏移量,通过偏移量可以找到唯一的一个age(成员属性)
Alpaca alpaca;
alpaca.Sheep::age = 10;
alpaca.Camel::age = 20;
cout << alpaca.Sheep::age << endl;
cout << alpaca.Camel::age << endl;
cout << alpaca.age << endl;
}
void test03()
{
Alpaca alpaca01;
cout << *((int*) * (int*)& alpaca01 + 1) << endl;
//&alpaca01 去首地址
//(int*)&alpaca01 转到虚基表
//*(int*)&alpaca01 解引用,找到第一个偏移量,但是这个偏移量不是alpaca01的
//((int*)*(int*)&alpaca01+1) 转为整型指针,指向下一个偏移量,这个偏移量才是alpaca01的
//*((int*)*(int*)&alpaca01+1) 解引用,即可得到偏移量
cout << *((int*) * ((int*)& alpaca01 + 1) + 1) << endl;
cout << "age = " << ((Animal*)((char*)& alpaca01 + *((int*) * (int*)& alpaca01 + 1)))->age << endl;
//(char*)& alpaca01 //首地址转为char型
//(char*)& alpaca01 + *((int*) * (int*)& alpaca01 + 1)) //加上偏移量 此时地址指向age所在的空间,但此时指针为char类型
//((Animal*)((char*)& alpaca01 + *((int*) * (int*)& alpaca01 + 1))) 转为类指针 通过类指针访问age
cout << "age = " << *((int*)((char*)& alpaca01 + *((int*) * (int*)& alpaca01 + 1))) << endl;
}
int main()
{
//test01();
//test02();
test03();
return 0;
}
输出结果: