面向对象
- 封装 encapsulation
- 继承 inheritance
- 多态 polymorphism
类之间关系
- is-a 继承体现
- has-a 组合体现
继承的意义
- 代码重用
- 体现不同抽象层次
公有继承
is-a关系。
子类的成员函数可以直接访问父类的公有/保护数据成员(不变),不能访问私有数据成员。
通过派生类的对象可以访问基类公有成员。
class Teacher: public Person{
public:
Teacher(char* pName)
:Person(pName){
grade = 0;
}
};
私有继承
子类不能做基类能做的所有事情,因此不是is-a关系。
不符合里氏代换原则:衍生类不能替换基类。
子类的成员函数可以直接访问父类的公有/保护数据成员(作为私有成员),不能访问私有数据成员。
通过派生类的对象不可以访问基类任何成员。
class Duck: private Animal{
}
多重继承
为一个派生类指定多个基类。
尽量避免多继承。
class A{
};
class B: public A{
};
class C: public A{
};
class D: public B, public C{
};
带来模糊性
使用双冒号指定。
虚拟继承
解决菱形继承。
class A{
};
class B: virtual public A{
};
class C: virtual public A{
};
class D: public B, public C{
};