单继承
1.单继承:一个子类只有一个直接父类时称这个继承关系为单继承;
多继承
2.多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承。
单继承:
多继承:
菱形继承;
class Person
{
public:
string _name; //姓名
};
class Student : public Person
{
protected:
int _num; //学生学号
};
class Teacher : public Person
{
protected:
int _tid; //职工编号
};
class Assistant :public Student, public Teacher
{
protected:
string _majorCourse; //主修课程
};
int main()
{
Assistant a;
a._name = "jjj";
//a.Student::_name = "jack";
//a.Teacher::_name = "rose";
}
如果没有指明要访问哪个父类成员,即a._name=“jjj”;将会出现以下错误:
如果指明要访问哪个父类成员,监视结果如下:
虚继承
虚继承主要解决了菱形的二义性和数据冗余问题。
1.虚继承解决了在菱形继承体系里面子类包含父类对象的数据冗余和二义性的问题;
2.虚继承虽然了数据冗余和二义性,但是也带来了性能上的损耗,所以一般不定义菱形结构。
下面将解释虚继承如何解决数据冗余和二义性问题:
class A
{
public:
int _a;
};
class B : virtual public A
{
public:
int _b;
};
class C : virtual public A
{
public:
int _c;
};
class D : public B, public C
{
public:
int _d;
};
int main()
{
D d;
d.B::_a = 1;
d.C::_a = 2;
d._b = 3;
d._c = 4;
d._d = 5;
}
以上代码存在数据冗余和二义性问题,我们先看看变量在内存在分布:
这样sizeof(d)=20;
那如果是虚继承呢?
//虚继承:只需要在子类的直接父类继承前加virtual,并不子类继承时加virtual
class B : virtual public A
{
public:
int _b;
};
class C : virtual public A
{
public:
int _c;
};
这时我们再看看变量在内存的分布,并且分布机理: