C++继承
1;定义:
类的继承,是新的类从已有类那里获得的已有的特性。由原有的类产生新类时,新类便包含了原有的类的特征,同时也可以加入自己所有的新特性。原有的类称为基类和父类,产生的新类称为子类和派生类。
定义语法为:
class 派生类:继承方式 基类名1,继承方式 基类名2,······
eg:
class Base{ public; int a=2; }; class Derived:public Base{ public; int b=3; };
使用继承的目的和作用:使代码看起来更加的简洁。
2:继承的三大分类
1:公有继承
2:私有继承
3:保护继承
1;公共继承;当类的继承方式为此时,基类的公有成员和保护成员的访问属性在派生类中不变,而基类的私有成员不可直接访问。
2;私有继承:当类的继承方式为此时,基类中的公有成员和保护成员都以私有成员的身份出现在派生类中,而基类的私有成员在派生类中不可直接访问。
3:保护继承;基类的公有成员和保护成员都以保护成员的身份出现在派生类中,而基类的私有成员不可直接访问。
3;类型兼容规则:
在任何需要基类对象的任何地方,都可以使用公有派生类的对象来替代,在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。
class B{.....} class D:public B{.....} B b1,*pb1; D d1;
替代情况:
1;派生类的对象可以隐含转换为基类对象
b1=d1;
2;派生类的对象可以初始化基类的引用
B &rb=d1;
3;派生类的对象可以隐含转化为基类的指针
pb1=&d1;
4:派生类的构造和析构函数
1:构造函数
注意事项:
1;构造派生类的对象时,就要对基类的成员对象和新增成员对象进行初始化
2:如果对基类初始化时,需要调用基类的带有形参表的构造函数时,就必须要声明构造函数
eg:
#include <iostream> using namespace std; class Base{ public: Base(){ cout << "Base的构造函数" << endl; } }; class Derived:public Base{ public: Derived(){ cout << "Derived的构造函数" << endl; } }; int main() { Derived s; }
原则:先构造父类,再构造成员变量、最后构造自己
2:析构函数
注意事项:
在派生过程中,基类的析构函数也不能继承下来,如果需要析构的话,就要在派生类中声明新的析构函数。
eg:
#include <iostream> using namespace std; class Base{ public: ~Base(){ cout << "Base的析构函数" << endl; } }; class Derived:public Base{ public: ~Derived(){ cout << "Derived的析构函数" << endl; } }; int main() { Derived s; }
原则:先析构自己,在析构成员变量、最后析构父类。
综上可以看出,构造和析构的顺序是不同的。
5:继承中的派生类成员的标识和访问
注意事项;
1:在继承体系中基类和派生类都有独立的作用域。
2:子类和父类中有同名成员,子类成员将屏蔽父类对同名成员的直接访问,这种情况叫“隐藏”,也叫“重定义”(在子类成员函数中,可以使用 基类::基类成员 显示访问 )
3:需要注意的是如果成员函数的隐藏,只需要函数名相同就构成了隐藏。:
4: 在实际工程中,继承体系里最好不要定义同名成员。
eg:
class Person { protected: string _name ="小明"; //姓名 int _num = 513030; //身份证号 }; class Student :public Person { public: void Print(){ cout << "姓名: " << _name << endl; cout << "身份证: " << Person::_num << endl; cout << "学号: " << _num << endl; } protected: int _num = 001; //学号 }; void Test() { Student s1; s1.Print(); }
6;继承中的多继承
通常来说,一个子类只有一个父类,然而多继承是指一个子类有多个父类。
eg:多继承同名隐藏
#include <iostream> using namespace std; class Base0{ public: int var0; void fun0() { cout <<"Member of Base0"<< endl; } }; class Base1:public Base0 { public: int var1; }; class Base2:public Base0 { public: int var2; }; class Derived:public Base1,public Base2{ public: int var; void fun() { cout <<"Member of Derived"<< endl; } }; int main() { Derived s; s.Base1::var0=2; s.Base1::fun0(); s.Base2::var0=3; s.Base2::fun0(); return 0; }