zoukankan      html  css  js  c++  java
  • C++中为什么构造函数不能定义为虚函数

    关于C++为什么不支持虚拟构造函数,Bjarne很早以前就在C++Style and Technique FAQ里面做过回答

    Avirtual call is a mechanism to get work done given partialinformation. In particular, "virtual" allows us to call afunction knowing only an interfaces and not the exact type of theobject. To create an object you need complete information. Inparticular, you need to know the exact type of what you want tocreate. Consequently, a "call to a constructor" cannot bevirtual.

    出处:Stroustrup: C++ Style and Technique FAQ

    含义大概是这样的:虚函数调用是在部分信息下完成工作的机制,允许我们只知道接口而不知道对象的确切类型。 要创建一个对象,你需要知道对象的完整信息。 特别是,你需要知道你想要创建的确切类型。 因此,构造函数不应该被定义为虚函数。

    从C++之父Bjarne的回答我们应该知道C++为什么不支持构造函数是虚函数了,简单讲就是没有意义(不能)。虚函数的作用在于通过基类的指针或引用来调用派生类的那个成员函数。而构造函数是在创建对象时自己主动调用的,不可能通过基类的指针或者引用去调用。

    网络上还有一个很普遍的解释是这样的:虚函数相应一个指向vtable虚函数表的指针,但是这个指向vtable的指针事实上是存储在对象的内存空间的。假设构造函数是虚的,就须要通过 vtable来调用,但是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。

    本人对这个观点并不认同,这主要是因为用什么方式实现虚函数是编译器的事情,使用Vtable只是大多数编译器采用的一种手段,并不代表编译器实现不了虚构造函数,编译器之所以不支持虚构造函数主要原因就是没有必要,所以正好这种实现方式也不支持,巧合而已。

  • 相关阅读:
    vmware克隆linux出错:Device eth0 does not seem to be present
    IDEA中项目路径问题
    Intellij idea 报错:Error : java 不支持发行版本5
    equals和==的区别
    指定Python版本下pip安装“pip install”
    大数据5V特点(5Vs of Big Data)
    大二下每周总结
    大二 下学期——期末个人总结(课程评价及加分项)
    大二下学期第二次个人作业第二阶段
    大二下学期第二次个人作业第二阶段
  • 原文地址:https://www.cnblogs.com/boldness2012/p/12343328.html
Copyright © 2011-2022 走看看