这是一个“鸡生蛋还是蛋生鸡”的问题。

首先我们要明白,虚函数是如何调用的。如果一个类有虚函数,那么必然对应一个虚函数表vtable,这个虚函数表的指针指向的是虚函数的地址。当一个基类指针想要调用派生类的虚函数的时候,需要通过这个虚函数表来查找调用这个派生类的虚函数。

那么,既然知道了虚函数是如何调用的,那么虚函数表是什么时候形成的呢?它是构造函数初始化示例的时候进行初始化的,也就是说构造函数初始化示例的时候,它也会初始化虚函数表。如果构造函数也是虚函数,那么都没有虚函数表,他如何去找这个虚函数表来调用自己这个虚函数呢?这就陷入了“鸡生蛋蛋生鸡”的问题了。

#include <iostream>
using namespace std;

class Parent
{
public:
    virtual Parent(int a = 0)//声明构造函数是虚函数
    {
        _a = a;
    }
private:
    int _a;
};

class Child : public Parent
{
public:
    Child(int b = 0)
    {
        _b = b;
    }
private:
    int _b ;
};

int main()
{
    Parent p;

return 0;
}

编译报错结果: 
error: constructors cannot be declared virtual [-fpermissive] 即构造函数不能是虚函数

为什么C++构造函数不能是虚函数相关推荐

  1. C++类的构造函数不能为虚函数的原因

    1 C++类的对象构造的时候,首先申请一片内存,然后调用构造函数进行初始化: 我们知道,存在虚函数的话,也会存在一个虚函数表vtable,而虚函数表示在什么时候产生的呢,当然是在调用构造函数之后产生的 ...

  2. C# 构造函数中调用虚函数

    C# 构造函数中调用虚函数 using System; using System.Diagnostics; using System.Text; using System.Collections; u ...

  3. 构造函数不能为虚函数

    2019独角兽企业重金招聘Python工程师标准>>> 1,从存储空间角度 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的.问题出来了,如 ...

  4. 为什么构造函数不能是虚函数

    为什么构造函数不能是虚函数 从存储空间角度看,使用虚函数时,系统要有一定的空间开销,当一个类带有虚函数时,编译系统会为该类构造一个虚函数表(virtual function table),他是一个指针 ...

  5. C++中为何构造函数不可是虚函数,而析构函数可以?

    构造函数不可以是虚函数: 从实现上看,虚函数表在构造函数调用后才建立,因而构造函数不可能成为虚函数 从实际含义上看,在调用构造函数时还不能确定对象的真实类型(因为子类会调父类的构造函数):而且构造函数 ...

  6. 面试准备每日五题:C++(七)——左值右值、面向对象、四种cast转换、拷贝构造函数赋值、虚函数多态

    文章目录 一. 什么是右值引用,跟左值又有什么区别? 二. 面向对象的三大特征 三. c++中四种cast转换 四.拷贝构造函数和赋值运算符的认识 五. 对虚函数和多态的理解 一. 什么是右值引用,跟 ...

  7. 构造函数可以是虚函数吗?不看看你就亏大了

    首先,构造函数是不能为虚函数的 调用构造函数后, 才能生成一个对象. 假设构造函数是虚函数, 虚函数存在于虚函数表中, 而去找虚函数表又需要虚函数表指针, 而虚函数表指针又存在于对象中, 这样就矛盾了 ...

  8. 构造函数不能为虚/重载函数总结

    构造函数不能为虚/重载函数总结 作为一个类,他最基础的成员函数就要数构造函数了.这里我们先探讨一下构造函数为什么不能是虚函数. 在解决这个问题之前,要先明白类中函数的调用方式.一个类的函数共用一个函数 ...

  9. C++中最好不要在构造函数和析构函数中调用虚函数!!!

    1.最好不要在基类和派生类的构造和析构函数中调用虚函数,不会出现多态性 实例如下: #include "iostream"using namespace std;class Bas ...

最新文章

  1. CMD一键获取 所有连接过的WIFI密码
  2. 深度Linux13,Ubuntu 13.04安装Linux Deepin特色软件
  3. [Nginx] Nginx 配置location总结
  4. C++程序员学Python:C与Python进行交互
  5. centos6.5安装docker
  6. Python实现二叉树的非递归先序遍历
  7. maya 中使用节点连接来求余数:
  8. 树莓派设置静态IP的好处与坏处
  9. 我的第一次Pascal程序
  10. 从输入URL到页面展现的全过程
  11. 【知识兔】Excel多级联动关联下拉菜单的制作,一看就会!
  12. google 常用的技术搜索关键词
  13. python,执行pip报错:Fatal error in launcher: Unable to create process using ‘“D:\tools\python.exe“ (已解决)
  14. 给你一个Pull Request的机会
  15. Java学习手册:大疆创新2020届校园招聘——软件类岗位B卷题一
  16. wordpress会员插件_最好的免费WordPress会员插件
  17. 按键精灵 剑网三帮派钓鱼脚本
  18. OpenVINO: export failure: libpython3.9.so.1.0: cannot open shared object file: No such file or direc
  19. MIT又出新玩法,利用AI可轻松分离视频中的乐器声音
  20. logrotate详情和坑点

热门文章

  1. python从入门到精通 明日科技 电子书-python从入门到项目实践 (明日科技) 配套视频教程+源码...
  2. 手机上有没有学python的软件-有哪些可以在手机上敲Python代码的App
  3. python练手经典100例-20个Python练手经典案例,能全做对的人确实很少!
  4. python代码翻译器-【分享】python 翻译器,爬取百度翻译,并附上源码
  5. python必背入门代码-初学Python必背手册
  6. 孕期服务器声音影响,噪音多少分贝影响胎儿听力
  7. 单片机如何在一数据包前加标识呢_单挑Google面试官,一上来就问我Chrome底层原理和HTTP协议(万字长文)...
  8. Vue-组件之间的数据共享
  9. 算法-满足条件的数字放在新数组
  10. mysql 表 字符集_如何查看MySQL数据库/表/列的字符集?