C++ 为什么构造函数不可以是虚函数

news/2024/7/8 7:12:45

为什么构造函数不可以是虚函数

  • 从内存的角度看:
    虚函数对应一个虚函数表,虚函数表是存储在对象的内存空间中的。而调用虚函数使用过调用虚函数表来实现的。
    **如果构造函数是虚函数,那么就需要通过虚函数表来调用,但是对象是通过构造函数实例化的,在调用构造函数之前,,虚函数表内存空间还没有被创建,无法找到虚表。**所以构造函数不能是虚函数

  • 从使用的角度看:
    虚函数是通过指向派生类的基类指针或引用,访问派生类中同名覆盖成员函数。,但是构造函数是通过创建对象时自动调用的,不可能通过父类的指针或者引用去调用,所以规定构造函数不能是虚函数.

为什么析构函数可以是虚函数

一个派生类的指针可以安全地转化为一个基类的指针。这样删除一个基类的指针的时候,C++不管这个指针指向一个基类对象还是一个派生类的对象,调用的都是基类的析构函数而不是派生类的。如果你依赖于基类的析构函数的代码来释放资源,而没有重载析构函数,那么会有资源泄漏。

C++不把虚析构函数直接作为默认值的原因是虚函数表的开销以及和C语言的类型的兼容性。有虚函数的对象总是在开始的位置包含一个隐含的虚函数表指针成员。


http://www.niftyadmin.cn/n/3293223.html

相关文章

cookie ,session 和localStorage的区别详解

当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来。当下次你再光临同一个网站,WEB 服务器会先看看有没有它上次留下的 Cookie 资料,有的话&…

linux每天一个命令(ls)

ls 命令 参数解释-a显示所有文件及目录 (包括以“.”开头的隐藏文件)-l使用长格式列出文件及目录的详细信息-r将文件以相反次序显示(默认依英文字母次序)-t根据最后的修改时间排序-A同 -a ,但不列出 “.” (当前目录) 及 “…” (父目录)-s显示文件大小-S根据文件大…

VS中关于字节大小的总结

说明:关于字节对齐的问题,很多人给出的答案是通过设置#pragma pack (1)的方式进行操作。但是在不是很考虑空间占用或者不是发送协议包等情况下,为了让程序跑的更快,是不会进行该设置。 以下均以默认的字节对齐方式 1、在结构体中&…

HDU 3060 多边形面积并

Area2 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1197 Accepted Submission(s): 278Problem Description小白近期又被空军特招为飞行员,參与一项实战演习。演习的内容还是轰炸某个岛屿&#x…

C++ STL set自定义比较函数

C STL 容器很多都可以自定义比较函数&#xff0c;给容器调用&#xff0c;对其中的子项做排序。下面是一个小例子&#xff1a; #include <set> #include <string> #include <iostream>using namespace std;class CTest { public:CTest() { num 0; str "…

PHP网站开发方案(开发新人必读)

PHP网站开发方案&#xff08;开发新人必读&#xff09; 一、开发成员a)项目主管b)页面美工c)页面开发d)服务端程序开发e)系统与数据管理f)测试与版本控制二、 网站组开发简明流程三、 开发工具与环境a)服务器配置i. WEB服务器&#xff1a; FreeBSD6.1Apache2.0PHP5.0&#xff0…

C++ 类的声明笔记

类的声明 类的声明和定义可分开&#xff0c;只声明不定义叫做向前声明&#xff0c;它在声明之后定义之前是不完全类型 不完全类型 可以定义指向这种类型的指针或引用也可以声明(但是不能定义)以不完全类型为参数或者返回类型的函数也不可以声明不完全类型的变量 可以声明为…

[Spring MVC]学习笔记--FreeMarker的使用

还是先贴出该例子存于github上的位置 https://github.com/lemonbar/spring-mvc-freemarker Sping-Framework 的官方文档简单列出了在spring-mvc中如何使用freemarker, 但是相对来说提供的信息和例子太少, 所以在这给出一个详细的例子. 注&#xff1a;我是在maven基础上进行的构…