虚函数
virtual只能存在于类定义的函数声明中,定义函数的时候不用

多态
多态的表现形式一
派生类的指针可以赋值给基类指针。
通过基类指针调用基类和派生类中的同名虚函数时,如果指针指向的是基类对象,则调用基类的虚函数;反之,调用派生类的虚函数

多态的表现形式二
派生类的对象可以赋值给基类引用
通过基类引用调用基类和派生类中的同名虚函数时,若该引用指向的是一个基类对象,那么调用基类虚函数;反之,调用派生类的虚函数。

多态的作用
增强了程序的可扩充性。
在构造函数和析构函数中调用虚函数,不是多态,。在编译时就可以确定。调用的函数是自己的类或者基类中定义的函数,不会等到运行时才决定调用自己的还是派生类的函数。我们不建议这样做,因为:1. 构造函数或者析构函数调用虚函数并不会发挥虚函数动态绑定的特性,跟普通函数没区别。2.即使构造函数或者析构函数如果能成功调用虚函数, 程序的运行结果也是不可控的

在非构造、非虚构函数的成员函数中调用虚函数,是多态

关于上述两种情况的例子

一点解释:第一次在构造函数中调用虚函数因为son中有hello这个虚函数,所以直接调用自己的;最后的析构函数中,先执行groundson的析构函数,再执行son的析构函数,因为son本身不含虚函数,所以调用基类的虚函数,也就是“bye from myclass”。

派生类和基类中同名的虚函数,不用加virtual关键字
虚函数的访问权限

多态的实现原理(虚函数表)


每一个有虚函数的类(或有虚函数的派生类)都有一个虚函数表,实例化一个对象,该对象的第一个存储单元存放的必定是虚函数表的指针p_table,这个指针指向虚函数表table,而虚函数表table中存放的是对应的各种虚函数的地址。当一个类调用通名虚函数时,就去虚函数表中找对应类的虚函数。


代码
更换类指针指向的东西(全部,虚函数表+类成员)
注意:其中的拷贝赋值函数“* p2=* p1”,是一个深拷贝,因为经过测试,指向的完全是两块内存。
关于深拷贝、浅拷贝,参考我的这篇博客
/**
* 测试替换虚函数表以后的类
* */
#include <iostream>
using namespace std;
class A{
public:
A(){
b=44;}
virtual

最低0.47元/天 解锁文章
2267





