2024.08.02
1.关于虚函数:
(1)定义:是在基类中进行的,成员函数声明前冠以关键字virtual。
(2)作用:虚函数使C++支持运行时的多态性。
(3)用法:a.基类的成员函数前加 virtual ,且在派生类中重载。
b.用指针调用实际对象的成员函数。
(4)特性:a.动态多态性 b.在基类中声明 c.继承性 d.运行时决策
(5)注意事项:
a.派生类重载时,函数原型要与基类原型完全相同。
b.赋值兼容前提:派生类从基类公有继承。
虚函数基础:赋值兼容规则。
因此,通过虚函数使用多态性机制时,必须公有派生。
c.派生类对虚函数重载时,virtual可写可不写,最好写。
d.只有通过基类指针访问虚函数才能获得运行时的多态性。
(m.show()以及M::show()也可访问,但是静态连编,没有充 分利用虚函数的特性)
e.虚函数必须是所在类的成员函数,不能是友元函数、静态成员函数、内联函数、构造函数。
f.析构函数可以是虚函数,而且通常说明为虚函数。
2.发现豆包是一个很好用的工具,可以很好地辅助我的学习!
(1)弄清楚了using namespace std;的使用:
(2)弄清楚了三种函数参数传递的方式:
同时对问题的解惑也很细致:
但是对一些内容也存在准确性的问题,所以也要仔细辨别:
此处得到的仍然是错误的结果,所以可以辅助使用,不能过度依赖。
2024.08.03
1.虚析构函数:
(1)引入:无虚析构函数时,静态连编,当用delete撤销无名对象时,系统只执行基类的析构函数,不执行派生类的。
(2)定义:没有类型,也没有参数。
(3)特点:基类为虚析构函数时,其派生类自动为虚析构函数。
2.虚函数与函数重载:
(1)普通函数重载:参数或参数类型必须有所不同。
(2)重载虚函数:与基类中虚函数类型完全相同。
(特况:a.仅返回类型不同,系统出错;
b.仅函数名同,为普通重载,丢失虚函数特性。)
3.纯虚函数:
(1)定义:声明虚函数时被“初始化”为0的函数。无函数体,不具备函数功能,不能被调用。eg: virtual void show()=0;
(2)作用:基类中预留一个函数名,具体功能留给派生类定义。
4.抽象类:
(1)定义:如果一个类至少有一个纯虚函数,那么该类为抽象类。
(2)目的:定义抽象类的唯一目的是用它为基类建立派生类。
(3)使用:a.只能作为基类,不能建立对象,可建立指针或引用。
b.不允许从具体类(不含纯虚函数的普通类)中派生出抽象类。
c.抽象类不能作函数的参数类型、返回类型或显式转换类型。
d.如果派生类只继承基类的纯虚函数,没有定义,则其仍是抽象类;若派生类给出 了基类纯虚函数的实现,则不再是抽象类。