C++中哪些函数不能声明为virtual?

首先要明确,virtual是用于支持类多态的关键字,因此出如今类声明以外的地方都是错误的。由此能够判定下文的1 前端

  • 普通函数(即非类成员函数)不能是virtual的,不然不能经过编译,virtual只能出如今类声明中。
  • 构造函数(拷贝构造函数/赋值构造函数)不能是virtual的。编译器会为每个含有virtual函数生成一个函数表(位于rodata段),每一个类实例的最前端会包含一个指向该表的指针。若是构造函数也能够virtual,那么须要一个虚函数指针指向对应的虚函数表,但此时对象并未构造,虚函数指针是不存在的。这就出现了矛盾。若是在基类和子类构造函数中都调用了虚函数的话,将发以下事件:调用子类构造函数,以前先调用基类的构造函数,此时只会调用基类的该函数而非子类的重载函数,由于此时子类对象并未构造彻底,虚函数指针不起做用。
  • 静态成员函数不能是virtual的,由于静态成员函数属于类而非单个具体对象,全部的对象共享一份代码,没有实现多态的必要。
  • inline成员函数能够声明为virtual,可是在编译时不会实际将代码直接在调用处展开。
  • 友元函数也不能声明为virtual,由于友元关系是不能被继承的,编译会出错。
相关文章
相关标签/搜索