C++多态
多态用一句话来总述就是:父类的指针或者引用指向基类的对象 多态分为两种: 编译时多态(静态多态):函数重载,运算符重载 运行时多态(动态多态):派生类,虚函数 静态多态:函数地址早绑定 动态多态:函数地址晚绑定 子类在构造前必须先构造父类,再构造子类,析构顺序相反 non-virtual函数:你不希望子类重写这个函数(override) virtual函数:你希望子类重写这个函数,且你已经有了默认定义 pure-virtual函数:你希望子类一定要重写这个函数,且你对它没有默认定义 ①构造函数可以设置为虚函数吗? 1.从存储空间角度。 虚函数对应一个vtable,这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。 2,从使用角度 构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。 3、从实现上看,vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数 ②虚析构函数 如果子类的成员变量有堆区开辟的空间