多重继承中,如果有两个类继承于同一个基类,要加关键字virtual说明为虚继承,以避免二义性。
继承后的子类对象成员变量的地址顺序,只与继承顺序有关。
下面为具体代码实现:
#include <iostream>
#include <cstring>
using namespace std;
class Inital
{
public:
int m_inital;
public:
Inital(int m);
~Inital();
};
Inital::Inital(int m)
{
cout<<"Inital Constructor"<<endl;
m_inital = m;
}
Inital::~Inital()
{
cout<<"Inital Destructor"<<endl;
}
class A:virtual public Inital //A B 都由类Inital派生,要说明为virtual
public:
int m_a;
public:
A(int a,int m);
~A();
void print1()
{
cout<<"hello a"<<endl;
}
};
A::A(int a,int m):Inital(m)
{
cout<<"A Constructor2"<<endl;
m_a = a;
}
A::~A()
{
cout<<"A Destructor"<<endl;
}
class B:virtual public Inital
{
public:
int m_b;
public:
B(int b,int m);
~B();
void print2()
{
cout<<"hello b"<<endl;
}
};
B::B(int b,int m):Inital(m)
{
cout<<"B Constructor2"<<endl;
m_b = b;
}
B::~B()
{
cout<<"B Destructor"<<endl;
}
class C:public B,public A //多重继承的顺序决定了子类对象中成员变量的地址顺序
{
public:
char *m_c;
public:
C(int a,int b,char *c,int m);
~C();
void print3()
{
cout<<"hello c"<<endl;
}
};
C::C(int a,int b,char *c,int m):A(a,m),B(b,m),Inital(m)//注意加上最上层的构造函数
{
cout<<"C Constructor"<<endl;
m_c = new char[10];
{
public:
char *m_c;
public:
C(int a,int b,char *c,int m);
~C();
void print3()
{
cout<<"hello c"<<endl;
}
};
C::C(int a,int b,char *c,int m):A(a,m),B(b,m),Inital(m)//注意加上最上层的构造函数{
cout<<"C Constructor"<<endl;
m_c = new char[10];
strcpy(m_c,c);
}
C::~C()
{
cout<<"C Destructor"<<endl;
if(m_c != NULL)
delete[] m_c;
}
int main()
{
char *a = "abc";
C c(1,1,a,1);
c.print1();
c.print2();
c.print3();
cout<<sizeof(c)<<endl; //12
cout<<&c<<endl;
cout<<&c.m_a<<endl; //后是A
cout<<&c.m_b<<endl; //先继承的B
cout<<&c.m_c<<endl; //最后是子类新定义的m_c
cout<<c.m_inital<<endl;
return 0;
}