菱形继承/多继承
多继承
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。
class A1 { // 基类一
public:
int m_a = 10;
};
class A2 { // 基类二
public:
int m_a = 20;
};
class B :public A1, public A2 { // 派生类
public:
int m_a = 30;
};
int main()
{
B b;
cout << " B::m_a的值是:" << b.m_a << endl;
cout << "A1::m_a的值是:" << b.A1::m_a << endl;
cout << "A2::m_a的值是:" << b.A2::m_a << endl;
}
菱形继承
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。
class A {
public:
int m_a = 10;
};
class B : public A { };
class C : public A { };
class DD : public B, public C {};
int main()
{
DD d;
d.B::m_a = 30;
d.C::m_a = 80;
cout << "B::m_a的地址是:" << &d.B::m_a << ",值是:" << d.B::m_a << endl;
cout << "C::m_a的地址是:" << &d.C::m_a << ",值是:" << d.C::m_a << endl;
cout << "B::A::m_a的地址是:" << &d.B::A::m_a << ",值是:" << d.B::A::m_a << endl;
cout << "C::A::m_a的地址是:" << &d.C::A::m_a << ",值是:" << d.C::A::m_a << endl;
}
虚继承virtual
为了解决多继承中的菱形继承的内存空间冗余和变量名称的二意性,使用虚继承的方法、
一份变量…
#include <iostream> // 包含头文件。
using namespace std; // 指定缺省的命名空间。
class A {
public:
int m_a = 10;
};
class B : virtual public A { };
class C : virtual public A { };
class DD : public B, public C {};
int main()
{
DD d;
d.B::m_a = 30;
d.C::m_a = 80;
cout << "B::m_a的地址是:" << &d.B::m_a << ",值是:" << d.B::m_a << endl;
cout << "C::m_a的地址是:" << &d.C::m_a << ",值是:" << d.C::m_a << endl;
cout << "B::A::m_a的地址是:" << &d.B::A::m_a << ",值是:" << d.B::A::m_a << endl;
cout << "C::A::m_a的地址是:" << &d.C::A::m_a << ",值是:" << d.C::A::m_a << endl;
}
vbptr是虚基类指针…