继承方法
三种数据成员
1. public:public表明该数据成员、成员函数是对所有用户开放的,所有用户都可以直接进行调用
2. private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用。
3. protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。
三种继承方法
不可见的意思:子类继承父类所有的成员,即还是占用子类内存的,但是不能访问父类的私有成员。
特殊成员函数的继承
析构函数的调用顺序与构造函数的调用顺序相反。
构造函数
基类的构造函数不能被继承的原因如下:
1. 构造方法的方法名与类名必须一样,父子类不能同名,故不能继承,更不可能被重写派生类;
2. 构造函数和成员函数存在区别:构造函数用于创建新的对象,而其他成员函数是被现有的对象调用。
子类构造函数会调用父类构造函数
子类隐式调用父类构造函数:的构造函数没有显示调用父类的构造函数,则会调用父类的默认无参构造函数;
子类显式调用父类构造函数 :fish():animal(400,300),c(100){}。
析构函数
首先给出结论:在不了解原理的情况下,析构函数写成虚函数一定不会出错。
delete指向子类的基类指针:释放子类和基类内存;
delete指向基类的基类指针:只释放基类内存。
虚析构函数
不管指针指向的是base还是derived,都是先执行子类析构,再执行父类析构。
原理解释:
内存分配
如图actress继承自sensei,当子类中有与父类同名的虚函数时,会修改父类中对应虚表项地址;当子类中有新的不同名的虚函数时,会在虚表后添加一项。
虚表的用途
实现动态多态
哪些函数不能定义为虚函数?
1)友元函数,它不是类的成员函数
2)全局函数
3)静态成员函数,它没有this指针
3)构造函数,拷贝构造函数,以及赋值运算符重载(可以但是一般不建议作为虚函数)
比如工厂模式