为什么C++构造函数不能是虚函数
这是一个“鸡生蛋还是蛋生鸡”的问题。
首先我们要明白,虚函数是如何调用的。如果一个类有虚函数,那么必然对应一个虚函数表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++构造函数不能是虚函数相关推荐
- C++类的构造函数不能为虚函数的原因
1 C++类的对象构造的时候,首先申请一片内存,然后调用构造函数进行初始化: 我们知道,存在虚函数的话,也会存在一个虚函数表vtable,而虚函数表示在什么时候产生的呢,当然是在调用构造函数之后产生的 ...
- C# 构造函数中调用虚函数
C# 构造函数中调用虚函数 using System; using System.Diagnostics; using System.Text; using System.Collections; u ...
- 构造函数不能为虚函数
2019独角兽企业重金招聘Python工程师标准>>> 1,从存储空间角度 虚函数对应一个vtable,这大家都知道,可是这个vtable其实是存储在对象的内存空间的.问题出来了,如 ...
- 为什么构造函数不能是虚函数
为什么构造函数不能是虚函数 从存储空间角度看,使用虚函数时,系统要有一定的空间开销,当一个类带有虚函数时,编译系统会为该类构造一个虚函数表(virtual function table),他是一个指针 ...
- C++中为何构造函数不可是虚函数,而析构函数可以?
构造函数不可以是虚函数: 从实现上看,虚函数表在构造函数调用后才建立,因而构造函数不可能成为虚函数 从实际含义上看,在调用构造函数时还不能确定对象的真实类型(因为子类会调父类的构造函数):而且构造函数 ...
- 面试准备每日五题:C++(七)——左值右值、面向对象、四种cast转换、拷贝构造函数赋值、虚函数多态
文章目录 一. 什么是右值引用,跟左值又有什么区别? 二. 面向对象的三大特征 三. c++中四种cast转换 四.拷贝构造函数和赋值运算符的认识 五. 对虚函数和多态的理解 一. 什么是右值引用,跟 ...
- 构造函数可以是虚函数吗?不看看你就亏大了
首先,构造函数是不能为虚函数的 调用构造函数后, 才能生成一个对象. 假设构造函数是虚函数, 虚函数存在于虚函数表中, 而去找虚函数表又需要虚函数表指针, 而虚函数表指针又存在于对象中, 这样就矛盾了 ...
- 构造函数不能为虚/重载函数总结
构造函数不能为虚/重载函数总结 作为一个类,他最基础的成员函数就要数构造函数了.这里我们先探讨一下构造函数为什么不能是虚函数. 在解决这个问题之前,要先明白类中函数的调用方式.一个类的函数共用一个函数 ...
- C++中最好不要在构造函数和析构函数中调用虚函数!!!
1.最好不要在基类和派生类的构造和析构函数中调用虚函数,不会出现多态性 实例如下: #include "iostream"using namespace std;class Bas ...
最新文章
- CMD一键获取 所有连接过的WIFI密码
- 深度Linux13,Ubuntu 13.04安装Linux Deepin特色软件
- [Nginx] Nginx 配置location总结
- C++程序员学Python:C与Python进行交互
- centos6.5安装docker
- Python实现二叉树的非递归先序遍历
- maya 中使用节点连接来求余数:
- 树莓派设置静态IP的好处与坏处
- 我的第一次Pascal程序
- 从输入URL到页面展现的全过程
- 【知识兔】Excel多级联动关联下拉菜单的制作,一看就会!
- google 常用的技术搜索关键词
- python,执行pip报错:Fatal error in launcher: Unable to create process using ‘“D:\tools\python.exe“ (已解决)
- 给你一个Pull Request的机会
- Java学习手册:大疆创新2020届校园招聘——软件类岗位B卷题一
- wordpress会员插件_最好的免费WordPress会员插件
- 按键精灵 剑网三帮派钓鱼脚本
- OpenVINO: export failure: libpython3.9.so.1.0: cannot open shared object file: No such file or direc
- MIT又出新玩法,利用AI可轻松分离视频中的乐器声音
- logrotate详情和坑点
热门文章
- python从入门到精通 明日科技 电子书-python从入门到项目实践 (明日科技) 配套视频教程+源码...
- 手机上有没有学python的软件-有哪些可以在手机上敲Python代码的App
- python练手经典100例-20个Python练手经典案例,能全做对的人确实很少!
- python代码翻译器-【分享】python 翻译器,爬取百度翻译,并附上源码
- python必背入门代码-初学Python必背手册
- 孕期服务器声音影响,噪音多少分贝影响胎儿听力
- 单片机如何在一数据包前加标识呢_单挑Google面试官,一上来就问我Chrome底层原理和HTTP协议(万字长文)...
- Vue-组件之间的数据共享
- 算法-满足条件的数字放在新数组
- mysql 表 字符集_如何查看MySQL数据库/表/列的字符集?