1.继承
(1)定义:继承是面向对象复用的重要手段,通过继承定义一个类,继承是类型之间的关系模型,共享共有的东西 ,实现各自本质不同东西。
class Person //父类/基类
{
public:
void Display()
{
cout<<_name<<endl;
}
protected:
string_name;
};
class Student:public Person
//子类/派生类 //继承关系
{
protected:
int_num;
};
void Test()
{
Person p;
Student s;
}
(2)三种继承关系:public(公有继承),protect(保护继承),private(私有继承)
三种继承关系下基类成员在派生类下的访问变化关系:
2.继承与转换
(1)子类对象可以赋值给父类对象,(如上面代码:p=s)
(2)父类对象的指针和引用可以指向子类对象,(Person*p1=&s,Person&r1=s)
3.单继承&多继承&菱形继承
(1)单继承:一个子类只有一个直接父类的继承关系。
(2)多继承:一个子类有两个或多个直接父类的继承关系。
(3)菱形继承:两个子类继承同一个父类,同时又有两个子类又分别继承这两个子类。
3.菱形继承存在的问题:
1)二义性 :即在Assistant类中存在两个name对象,
2)数据冗余:即在Assistant类中Student类和Teachar类中存在两个同名对象name相等的情况,
4.虚继承:为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。—–解决了二义性和数据冗余的问题,并且带来了性能上的损耗。
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 = 0;
d.C::_a = 1;
d._b = 2;
d._c = 3;
d._d = 4;
return 0;
}