c++作为一门面向对象的语言自然少不了面向对象的精髓:继承和多态。
继承:通过继承将有共同部分的、相互联系的类构成一种层次关系,共同部分组成的类一般在最顶端称为基类(父类),其他类直接或间接地继承基类,通过继承而来的这些类称为派生类(子类)。这样就可以实现复用,子类只需要继承父类就会拥有父类的所有东西。
子类对父类的访问权限:
public,protected都可以访问,private成员无法访问。一个类使用protected来声明那些他想与派生类分享但不想被其他公共部分访问使用的成员。
在public继承的前提下,满足一下赋值兼容规则:
(1)子类对象可以赋值给父类对象,反之则不行。
(2)父类对象的指针/引用可以指向/引用子类对象,反之不行。(子类除了拥有父类的成员,还拥有自己特有的。若将父类对象的地址赋给子类的指针,相当于扩大了指针的权限,解引用就有可能访问到非法空间,所以不可以);
当子类与父类成员(成员变量和成员函数)同名时,子类成员就会隐藏父类成员,当想要调用父类的重名函数时必须显式的调用;
多态:
多态是面向对象的重要特性之一,它是一种行为的封装,是同一种事物所表现出的多种形态,简单地说是”一个接口多种实现“;
多态允许将父类设置成和他的一个或更多的子对象相等即将子类赋值给父类;
两种类型:编译时的多态性。编译时的多态性是通过重载来实现的。
运行时的多态性。运行时的多态性是通过虚成员实现的。
纯虚函数:纯虚函数在基类中是没有定义的,必须在子类中加以实现。
如果基类含有一个或多个纯虚函数,那么它就属于抽象基类,不能被实例化。(java接口)
虚析构函数:虚析构函数保证了在析构时,避免只调用基类析构函数而不调用派生类析构函数的情况,保证资源正常释放,避免了内存释放。只有当一个类被用来作为基类的时候,才会把析构函数写成虚函数;