• 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只是大多数编译器采用的一种手段,并不代表编译器实现不了虚构造函数,编译器之所以不支持虚构造函数主要原因就是没有必要,所以正好这种实现方式也不支持,巧合而已。

  • 相关阅读:
    delphi xe10.4新功能介绍
    python tornado 增加数据库连接池
    sql server 自增型字段 在有数据的情况下 修改 标识种子
    c++定时重启某个windows程序
    mssql server 查看作业中执行了哪些脚本
    mssql server 13位时间戳互转
    delphi 13位时间戳互转
    博客开通啦
    java获取当前应用的运行信息(内存,线程,运行时间,状态等)
    java使用websocket,并且获取HttpSession,源码分析
  • 原文地址:https://www.cnblogs.com/boldness2012/p/12343328.html
Copyright © 2020-2023  润新知