[NKU]C++基础课(四)补充:继承
继承与派生(本文视频)半个小时精通C++继承和多态性!_哔哩哔哩_bilibili
龚老师学习网站(这个也很清楚):C++ 继承 | 菜鸟教程
雇员与经理例子
class Employee{
string name;
Date birthday;
string dept;
}
class Manager{
Employee emp;
int level;
...
}
Manager由Employee派生
Employee是一个基类,Manager包含Employee所有成员,以及自己的成员
派生类从基类继承了各种成员的关系被称为继承
class Manager:public Employee{
int level;
...
}
基类是对派生类的抽象,派生类是对基类的具体化
定义派生类的格式
class<派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,...,<继承方式n><基类名n>
{
<派生类新定义成员>
};
派生类的构成
基类继承下来的私有成员,派生类不能直接访问
基类继承下来的公有成员和保护乘员,派生类能直接访问
第一个例子
#include <iostream>
using namespace std;
//Point
class Point{
public:
void InitPoint(int x, int y); //初始化位置
void Move(int xOff, int yOff); //移动量
int GetX(){return X;} //内联函数 得到位置
int GetY(){return Y;}
private:
int X,Y;
};
void Point::InitPoint(int x, int y){
X=x;
Y=y;
}
void Point::Move(int xOff, int yOff){
X += xOff;
Y += yOff;
}
//Rectangle
class Rectangle : public Point {
public:
void InitRectangle(int x, int y, int w, int h);
int GetW(){return W;}
int GetH(){return H;}
private:
int W,H;
};
void Rectangle::InitRectangle(int x, int y, int w, int h){
InitPoint(x,y);
W=w;
H=h;
}
int main(){
Rectangle rect;
rect.InitRectangle(2,3,10,20);
rect.Move(3,2);
cout<<rect.GetX()<<','<<rect.GetY()<<','
<<rect.GetW()<<','<<rect.GetH()<<','<<endl;
return 0;
}
5,5,10,20
Point派生Rectangle派生Square
class Square:public Rectangle{
public:
void fun(){Move(3,2);}
}
第二个例子
因为objB对象属于基类Base,其中data是protcted类型因此不能访问
Base类的对象那个objB不能访问data
但是 Derived类的对象objD.fun()可以访问data
构造函数和析构函数比较麻烦,新增成员和派生成员都需要初始化
构造函数
例子
构造函数顺序:先基类后新增
析构函数
后构造的先析构
多继承中的二义性问题
一般是A情况
通过::作用域符号确定来源
虚基类解决二义性