C++自学笔记 多态性的实现 How virtual work in C++

 

静态联编所支持的多态性称为编译时的多态性。
当调用重载函数时,编译器可以根据调用时所使用的实参在编译时就确定下应调用哪个函数。

动态联编所支持的多态性称为运行时的多态性,这是由虚函数来支持。
虚函数类似于重载函数,但与重载函数的实现策略不同,即对虚函数的调用使用动态联编。

 

如果让编译器动态联编,也就是在编译“Point *p = &c”语句时,只根据兼容性规则检查它的合理性,也就是检查是否符合“派生类对象的地址可以赋给基类的指针”的条件。至于“p->area()”调用哪个函数,等程序运行到这里时再决定。(虚函数可以做到)

 

一旦基类定义了虚函数,该基类的派生类中的同名函数也自动成为虚函数。

 

虚函数只能是类中的一个成员函数,但不能是静态成员,关键字virtual用于类中该函数的声明中。

 

关键字virtual指示C++编译器对调用虚函数进行动态联编。

 

在构造函数和析构函数中调用虚函数采用静态联编。即它们调用的虚函数是自己类或基类中定义的函数。

 

由于析构函数不允许有参数,因此一个类只能有一个虚析构函数。

 

虚函数与抽象类

在许多情况下,不能在基类中为虚函数给出一个有意义地定义,这时可以将它说明为纯虚函数,将其定义留给派生类去做。说明纯虚函数地一般形式如下:

class Point{
  virtual int area(int) = 0;
  virtual double area() = 0;
}

一个类可以说明多个纯虚函数,包含有纯虚函数的类称为抽象类。
一个类可以说明多个纯虚函数,包含有纯虚函数的类成为抽象类。
一个类可以说明多个纯虚函数,包含有纯虚函数的类成为抽象类。
一个抽象类只能作为基类来派生新类,不能说明抽象类的对象。
一个抽象类只能作为基类来派生新类,不能说明抽象类的对象。
一个抽象类只能作为基类来派生新类,不能说明抽象类的对象。

从一个抽象类派生的类必须提供纯虚函数的实现代码,或在该派生类中仍将它说明为纯虚函数,否则编译器将给出错误信息。

posted @ 2022-10-04 20:35  slowlydance2me  阅读(13)  评论(0编辑  收藏  举报