什么是多态


20200715 v0.1 open VirtualFunction虚函数和接口20200715
20210208 v0.2 about java

CPP下的动态绑定-虚函数、纯虚函数和抽象类

虚函数:加virtual的函数,是调用时未必是这个实现(我可能在这里给了一个实现,但是你调用的是不是我的实现,要看运行时的情况);程序将根据引用或指针指向的 对 象 类 型 来选择方法,否则(正常情况下)使用引用类型或指针类型来选择方法。通过动态联编,用基类的引用或指针也可以调用派生类的函数实现了。

纯虚函数:加了virtual … =0的函数,是不做实现的函数(我要定义这么一个行为,但是我这里不做实现);

抽象类:自己是抽象的,没法定义对象。C++中含有纯虚函数的类为抽象类

虚函数=delete和=default(C++11)

=default:用于在显式定义了非默认构造函数之后,提示编译器为某个特殊成员函数生成默认实现,从而免去另写一个的工作量。

Q:为什么要设置基类的析构函数为虚函数?

普通情况下,用Y的指针析构对象时会先调用派生类Y的析构函数,再调用基类的析构函数;

  1. int main() {
  2. Y* pY = new Y;
  3. delete pY;
  4. }

而多态情况下——狭义地理解为,用类型为基类X的指针析构派生类Y的对象只会调用基类的析构函数,会使Y部分数据没有被释放造成内存泄漏;

  1. class X{...};
  2. class Y: public X{...};
  3. int main() {
  4. X* pX = new Y;
  5. delete pX;
  6. }

当设置基类的析构函数为虚函数时,即声明其为动态绑定,如上一节所说,虽然使用的是基类的指针,但是指向的对象为派生类的对象,所以可以调用派生类的析构函数;

Q: 为什么构造函数不能是虚函数?

virtual虚继承

  • 见“继承”

    Java下的动态绑定

  1. Java中是否有虚函数的概念?——没有体现在语法上,因为Java的普通方法的行为就与虚函数的动态绑定一致;
  2. Java的普通函数调用在其字节码实现上可以明确其动态绑定具体行为