继承
子类和父类(基类和派生类)
派生的四个步骤:
1.继承基类成员:除构造函数与析构函数外全部继承。
2.改造基类成员:同名的成员变量和成员函数就会造成覆盖(遮蔽),父类和子类成员函数是不会构成重载的。此时基类的成员仍可以被访问,只要加上类名和域解析符。
例:派生类对象.基类名::成员函数;
3.发展新成员
4.重写构造函数与析构函数。
继承的特性:
1.构造函数调用:创建派生类的对象时,先依次调用基类的构造函数,后执行派生类的构造函数。
2.析构函数调用:与构造函数调用顺序相反。
3.特殊成员-友元:友元关系不能继承,基类的友元对派生类没有访问权限。
4.特殊成员-static成员:静态成员可以被继承,继承规则遵循普通变量,由于静态成员储存在静态区,派生类继承下来的静态成员和基类的那个静态成员是 同一个地址下的同一个变量。
继承的使用:
格式如下: class 派生类名:继承方式 基类名{ 派生类新增加的成员 }; 实例: class Student: public People{ // 派生类新增加的成员 } 继承方式可选,如果不写,默认为 private(结构体struct,默认是public)
1.不同继承方式对不同属性成员的影响
注:由于 private 和 protected 继承方式会改变基类成员在派生类中的访问权限,导致继承关系复杂,所以实际开发中我们一般使用 public。
2.使用using关键字可以改变基类成员在派生类中的访问权限。但是using只能改变基类中public和protected成员的访问权限,不能改变private成员的访问权限,因为基类中private成员在派生类中是不可见的,根本不能使用,所以基类中的private成员在派生类中无论如何都不能访问。
注:using会破坏程序的原有体系,不建议使用。
#include <iostream> using namespace std; class animal { public: animal():age(13) { cout << "调用构造函数-animal(基类)" << endl; } ~animal() { cout << "调用析构函数-animal(基类)" << endl; } protected: int age; }; class marine_animal:public animal { public: // 将 protected 改为 public using animal::age; marine_animal() { cout << "调用构造函数-marine animal(派生类)" << endl; } ~marine_animal() { cout << "调用析构函数-marine animal(派生类)" << endl; } }; int main(int argc, char *argv[]) { marine_animal A; // age 被 using 关键字改为了 public,所以能直接调用。否则,protected 不能直接被对象调用。 cout << "输出派生类的age:" << A.age << endl; return 1; } 输出: 调用构造函数-animal(基类) 调用构造函数-marine animal(派生类) 输出派生类的age:13 调用析构函数-marine animal(派生类) 调用析构函数-animal(基类)
浙公网安备 33010602011771号