什么是多态
20200715 v0.1 open VirtualFunction虚函数和接口20200715
20210208 v0.2 about java
CPP下的动态绑定-虚函数、纯虚函数和抽象类
虚函数:加virtual的函数,是调用时未必是这个实现(我可能在这里给了一个实现,但是你调用的是不是我的实现,要看运行时的情况);程序将根据引用或指针指向的 对 象 类 型 来选择方法,否则(正常情况下)使用引用类型或指针类型来选择方法。通过动态联编,用基类的引用或指针也可以调用派生类的函数实现了。
纯虚函数:加了virtual … =0的函数,是不做实现的函数(我要定义这么一个行为,但是我这里不做实现);
抽象类:自己是抽象的,没法定义对象。C++中含有纯虚函数的类为抽象类
虚函数=delete和=default(C++11)
=default:用于在显式定义了非默认构造函数之后,提示编译器为某个特殊成员函数生成默认实现,从而免去另写一个的工作量。
Q:为什么要设置基类的析构函数为虚函数?
普通情况下,用Y的指针析构对象时会先调用派生类Y的析构函数,再调用基类的析构函数;
int main() {Y* pY = new Y;delete pY;}
而多态情况下——狭义地理解为,用类型为基类X的指针析构派生类Y的对象只会调用基类的析构函数,会使Y部分数据没有被释放造成内存泄漏;
class X{...};class Y: public X{...};int main() {X* pX = new Y;delete pX;}
当设置基类的析构函数为虚函数时,即声明其为动态绑定,如上一节所说,虽然使用的是基类的指针,但是指向的对象为派生类的对象,所以可以调用派生类的析构函数;
Q: 为什么构造函数不能是虚函数?
- 这个说的比较到位:C++中为什么构造函数不能定义为虚函数shilikun841122的博客-CSDN博客构造函数不能声明为虚函数
- 虚函数的本质是「在不关心对象实际类型的情况下」调用其接口;而构造函数就是要「创建明确类型的对象」;这两者在概念上是矛盾的;
- 而且当前的虚函数采用vtable的实现方式,依赖于对象实际存储空间的存在,在没有调用构造函数之前其虚函数是无意义的;
virtual虚继承
Java中是否有虚函数的概念?——没有体现在语法上,因为Java的普通方法的行为就与虚函数的动态绑定一致;Java的普通函数调用在其字节码实现上可以明确其动态绑定具体行为
