1.继承的作用:
代码复用
继承和派生, 基类和派生类
class Stu : public People
类标识 类名 访问限定符 基类类名
访问限定符一般都为public
2.派生类继承基类的什么东西
除了基类的构造和析构函数以外的所有成员 所以,派生类的构造需要自己实现
参考代码:
class Base
{
public:
Base(int b) :mb(b){} //基类构造
void Show()
{
std::cout << "mb : " << mb << std::endl;
}
void Show(int a)
{
std::cout << "a : " << a << std::endl;
}
protected:
int mb;
};
class Derive :public Base
{
public:
Derive(int d) :md(d), Base(d){} //派生类构造
void Show()
{
std::cout << "md : " << md << std::endl;
}
private:
int md;
};
int main()
{
Derive d(10);
d.Base::Show(10);
return 0;
}
3.访问限定符
public: 任意位置都可以访问
protected: 本类类中,子类类中访问
private: 本类类中访问
3.基类中不同的访问限定符下的成员以不同的继承方式在派生类中的访问限定
public protected private (访问限定符)
public public protected 不可见
protected protected protected 不可见
private private private 不可见
(继承方式) (访问限定)
基类的私有成员继承了但是属性是不可见的
protected 必须的子类的子类可访问
4.派生类对象的构造和析构方式
派生类 (1)基类部分 (2)2派生类部分
构造 : 先基类部分 ,后派生类部分
析构 : 先派生类部分,后基类部分
系统给基类部分调用默认的构造函数
Derive(int d) :md(d), Base(d){}
Base(d) 在参数列表中指明了构造方式,带一个参数
5.类和类的关系
组合 a part of has_a 桌子–>桌腿
继承 a kind of is_a 鸟—>鹰
代理 (通过表层限制底层的接口,实现新的特性)
class Date
class Stu
{
private:
char* mname;
int mage;
Date birth; //对象作成员变量,组合关系
};
6.同名函数的关系
6.1 函数重载 同名,同作用域,参数列表不同
6.2 隐藏 存在但看不见
(1)继承关系 基类和派生类同名的方法 不同作用域
(2).派生类中的同名函数隐藏了基类的所有同名函数 是在同作用域下的
6.3 覆盖
(1).继承关系 基类和派生类同名同参的方法 不同作用域
(2)派生类中同名同参数的虚函数会覆盖基类同名同参数的虚函数(在编译期间虚表覆盖)
d.Show(); //调派生类
d.Base::Show(); //用作用域才可调用基类
7.基类和派生类的相互指向或者引用
允许基类指针指向派生类对象
允许基类引用派生类对象
(将派生类转为基类,派生类是包含基类的,所以是可以的)
Base b;
Derive d;
Base* pbase2 = &d; //学生当人
Derive* pderive = &b; // 错误 人当学生
Base& rbase2 = b; //学生当人
Derive& rderive = d; // 错误 人当学生
*pbase 指针解引用是对象
8.多态 ==》 接口复用
8.1 静多态 //编译期间可确定函数的调用 静态绑定 早绑定
8.2 动多态 //运行期间可确定函数的调用 动态绑定 晚绑定
8.3 重载是一种静多态
8.4 基类中的函数是虚函数,派生类中同名同参的函数也是虚函数,vitual 给动多态提供支持
8.5 函数入口地址放在符号表中,符号表是在编译,链接时生成,但不加载到内存中。
8.6 若有虚函数,则多一个虚函数指针vfptr,指向虚函数所放的内存的入口地址 入口地址存在于虚表中,虚表存在于只读数据段(可加载到内存,在运行期间可等到函数的入口地址)
8.7 虚函数指针vfptr会合并
8.8 虚函数指针->虚表->rttl(运行时的类型信息)
9.什么情况会发生动多态的调用
1.指针或者引用调用虚函数
动多态-》寄存器(值在运行时才可知)
2.对象完整
构造,析构是静多态