2. 以下几种情况下虚函数的特性将失效
1)派生类没有重写该函数;
2)使用基类对象(包括将派生类强制转换成基类对象)调用虚函数;
示例代码如下:
其运行结果如下:
This is derivel
This is base
延伸知识点:强制类型转换将会在调用前生成一个临时目标类型的对象,调用完成后自动释放(析构)临时对象,示例代码如下:
运行结果如下:
未命名对象诞生了!
This is derivel
未命名对象的拷贝诞生了!
This is base
未命名对象的拷贝去了!
This is derivel
未命名对象去了!
3)在构造函数或析构函数中调用的虚函数与普通函数的调用规则相同,因为构造函数或析构函数只管当前类的构造或析构,在执行基类的构造函数时,派生类还未能完成构造,在执行基类的析构函数时,派生类对象已被析构了。
示例代码如下:
运行结果如下:
以下是在基类的构造函数中调用虚函数:
base::vf()
以下是在main函数中直接调用虚函数:
deriver::vf()
以下是在基类的普通函数中调用虚函数:
deriver::vf()
以下是在基类的析构函数中调用虚函数:
base::vf()
4)当明确指定函数的所属类时(使用“类名::函数名”方式调用时),将只调用指定函数,虚函数的特性将无效。这种情况常用于派生虚函数中需要执行基类代码同名函数时。
示例代码如下:
运行结果如下:
This is base
This is derivel
This is base