网站建设宀金手指花总十五营销手机系统安装
继承与派生(本文视频)半个小时精通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情况
通过::作用域符号确定来源
虚基类解决二义性