`
kanwoerzi
  • 浏览: 1640357 次
文章分类
社区版块
存档分类
最新评论

不能被声明为虚函数的C++函数

 
阅读更多

常见的不不能声明为虚函数的有:普通函数(非成员函数);静态成员函数;内联成员函数;构造函数;友元函数。

  1、为什么C++不支持普通函数为虚函数?

  普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时邦定函数。

  2、为什么C++不支持构造函数为虚函数?

  这个原因很简单,主要是从语义上考虑,所以不支持。因为构造函数本来就是为了明确初始化对象成员才产生的,然而virtual function主要是为了再不完全了解细节的情况下也能正确处理对象。另外,virtual函数是在不同类型的对象产生不同的动作,现在对象还没有产生,如何使用virtual函数来完成你想完成的动作。(这不就是典型的悖论)

  3、为什么C++不支持内联成员函数为虚函数?

  其实很简单,那内联函数就是为了在代码中直接展开,减少函数调用花费的代价,虚函数是为了在继承后对象能够准确的执行自己的动作,这是不可能统一的。(再说了,inline函数在编译时被展开,虚函数在运行时才能动态的邦定函数)

  4、为什么C++不支持静态成员函数为虚函数?

  这也很简单,静态成员函数对于每个类来说只有一份代码,所有的对象都共享这一份代码,他也没有要动态邦定的必要性。

  5、为什么C++不支持友元函数为虚函数?

  因为C++不支持友元函数的继承,对于没有继承特性的函数没有虚函数的说法。

  *********************************************************************

  1、顶层函数:多态的运行期行为体现在虚函数上,虚函数通过继承方式来体现出多态作用,顶层函数不属于成员函数,是不能被继承的。

  2、构造函数:(1)构造函数不能被继承,因而不能声明为virtual函数。

  (2)构造函数一般是用来初始化对象,只有在一个对象生成之后,才能发挥多态的作用,如果将构造函数声明为virtual函数,则表现为在对象还没有生成的情况下就使用了多态机制,因而是行不通的,如下例:

  view plain #include using namespace std;

  class B { public:B() {} virtual void show()

  { cout<<"***"<

  { cout<<"==="<

  int main(void)

  { B *pb;D d; //先生成对象pb=&d;pb->show(); //再体现多态

  pb=new D(); //先调用构造函数pb->show(); //再多态delete pb;return 0;} 3、static函数:不能被继承,只属于该类。

  4、友元函数:友元函数不属于类的成员函数,不能被继承。

  5、inline函数:inline函数和virtual函数有着本质的区别,inline函数是在程序被编译时就展开,在函数调用处用整个函数体去替换,而virtual函数是在运行期才能够确定如何去调用的,因而inline函数体现的是一种编译期机制,virtual函数体现的是一种运行期机制。此外,一切virtual函数都不可能是inline函数。

分享到:
评论

相关推荐

    构造函数不能声明为虚函数,析构函数可以声明为虚函数

    构造函数不能声明为虚函数,析构函数可以声明为虚函数。

    构造函数不能声明为虚函数的原因及分析

    所以构造函数不能是虚函数。 2. 从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。虚...

    C++函数中那些不可以被声明为虚函数的函数

     普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时邦定函数。  2、为什么C++不支持构造函数为虚函数?  这个原因很简单,主要是从语义上考虑,所以...

    C++函数中那些不可以被声明为虚函数的函数[参考].pdf

    C++函数中那些不可以被声明为虚函数的函数[参考].pdf

    虚函数c++语言

    虚函数:在某基类中声明为 virtual 并在一个或多个派生类中被重新定义的成员函数,用法格式为:virtual 函数返回类型 函数名(参数表) {函数体};实现多态性,通过指向派生类的基类指针或引用,访问派生类中同名...

    探讨C++中不能声明为虚函数的有哪些函数

    普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思,因此编译器会在编译时邦定函数。 多态的运行期行为体现在虚函数上,虚函数通过继承方式来体现出多态作用,顶层 函数不属于成员...

    c++多态性与虚函数练习题

    2、熟练掌握虚函数的作用及其使用方法。 3、掌握静态关联和动态关联的概念和用法。 4、理解纯虚函数和抽象类的概念和用法。 (二)实验内容 1、定义一个类A,在A中有两个私有的整型变量a和b,定义构造函数对a和b进行...

    C++中虚析构函数的作用

    我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数。可是,为什么要这样做呢?下面用一个小例子来说明:

    C++ 虚函数的详解及简单实例

    C++ 虚函数的详解 虚函数的使用和纯虚函数的使用。 虚函数是在基类定义,然后子类重写这个函数后,基类的指针指向子类的对象,可以调用这个函数,这个函数同时保留这子类重写的功能。 纯虚函数是可以不用在基类定义...

    C++中虚函数和纯虚函数定义

     一个成员函数被声明为虚函数后,在同一类族中的类不能再定义一个非virtual的但与该虚函数具有相同的参数(包括个数和类型)和函数返回值类型的同名函数。  根据什么考虑是否把一个成员函数声明为虚函数?  ①...

    虚函数虚表的详解,大家看看!

    个类如果有虚函数,不管是几个虚函数,都会为这个类声明一个虚函数表,这个虚表是一个含有虚函数的类的,不是说是类对象的。一个含有虚函数的类,不管有多少个数据成员,每个数据成员都有一个虚指针,在内存中,存放...

    设计基类点类(Point)、直接派生类圆类(Circle)、间接派生类圆柱体类(Cylinder),将求面积的函数(area)声明成虚函数,并在主函数实现虚函数

    题目:设计基类点类(Point)、直接派生类圆类(Circle)、间接派生类圆柱体类(Cylinder),将求面积的函数(area)声明成虚函数,并在主函数实现虚函数调用,输出点类、圆类和圆柱体类面积。提示:其他数据成员和...

    C++ 虚函数专题

    基类中使用virtual关键字声明的函数,称为虚函数。 虚函数的实现,通过虚函数表来实现的。即V-table 这个表中有一个类,用于储存虚函数的地址。解决其继承,覆盖的问题,用于保证其真实反映的函数。这样有虚函数的...

    浅析C++中的虚函数

    定义为virtual的函数是基类期待派生类重新定义的,基类希望派生类继承的函数不能定义为虚函数。 二、作用虚函数的作用是实现动态联编,也就是在程序的运行阶段动态地选择合适的成员函数,在定义了虚函数后,可以在...

    解析C++编程中virtual声明的虚函数以及单个继承

    主要介绍了C++编程中virtual声明的虚函数以及单个继承,剖析虚函数和单个基类所能够继承的成员,要的朋友可以参考下

    52_虚函数可以声明为inline吗1

    class Derived :public Base {//从语法上讲,这可以写成inline,只是当基类指针调派类时,不能内联,编译器会动忽略掉inline/

    详解C++编程中的虚函数

    主要介绍了详解C++编程中的虚函数,包括在什么情况下应当声明虚函数的相关讲解,需要的朋友可以参考下

    C++成员函数指针的应用

    但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的。 刚遇到这种语法时也许会让你止步不前...

Global site tag (gtag.js) - Google Analytics