5.1继承和派生
- 继承:在定义一个新类的时候,如果该类与某个已定义过的类相似,则可以将原来的类定义为基类,现在的定义为派生类
- 派生类是通过对基类进行修改和扩充得到的,派生类可以扩充新的成员变量和成员函数
- 派生类拥有基类所有成员函数和成员变量
class 派生类名:public 基类名
{
};
- 派生类在内存中储存时,最前面先是基类的对象,然后后面跟上自己的变量,成员函数等
5.2继承关系和复合关系
- 继承关系:
- 复合关系:
- k是类d的一个对象,类c中有k这个成员变量,则c和d是复合关系
- 不能说一个类是另外的一种
5.3基类/派生类同名成员函数和protected关键字
class base{
int j;
public:
int i;
void func();
};
class derived:public base{
public:
int i;
void access(){
j=5;
i=5;
base::i=5;
func();
base::func();
}
void func();
};
derived obj;
obj.i=1;
obj.base::i=1;派生类中的基类i赋值
- protected 关键字
- 基类private成员可被以下访问:
- 基类的public成员可被以下访问:
- 基类成员函数
- 基类友元函数
- 派生类成员函数
- 派生类友元函数
- 其他函数
- 基类protected成员可被以下访问:
- 基类成员函数
- 基类友元函数
- 派生类的成员函数可以访问当前对象的protected成员
class father{
protected:
int n;
};
class son:public father{
void a(){
n=3;
a.n=5;
}
};
5.4派生类构造函数
- 派生类对象包括基类对象
- 先执行基类构造函数再执行派生类构造函数,先执行派生类析构函数,再执行基类析构函数
构造函数名(形参表):基类名(基类构造函数实参表){
}
class a{
public:
int m,n;
a(int i,int j):m(i),n(j){}
};
class b:public a{
public:
int o;
b(int i,int j,int k):a(i,j),o(k){}
};
5.5public继承的赋值兼容规则
class base{};
class derived:public base{};
base b;
derived d;
- 派生类的对象可以赋值给基类对象
b=d; - 派生类对象可以初始化基类的引用
base & br=d; - 派生类对象地址可以赋值给基类指针
base* p=&d;很重要,后面程序很多用到 - 只有派生方式是public的时候上诉三个才可行
- 声明派生类的时候,只需要列出它的直接基类即可
- 派生类包括所有直接基类的变量和间接基类的变量