论C++继承
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;
}