为什么构造函数不能是虚函数
2015-08-13 10:51
281 查看
为什么构造函数不能是虚函数
从存储空间角度看,使用虚函数时,系统要有一定的空间开销,当一个类带有虚函数时,编译系统会为该类构造一个虚函数表(virtual function table),他是一个指针数组,存放每个虚函数的入口地址。然后还会有一个指向虚函数表的指针vptr,这个vptr指针其实是存储在对象的内存空间的,问题出来了,如果构造函数是虚的,就需要通过vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。
从使用角度看,如果不用虚函数,那么我们通过指向基类对象的指针,只能访问派生类中的基类成员,不能访问派生类增加的成员。虚函数的作用是通过指向基类的指针或引用能够访问派生类中增加的成员,而构造函数是在创建对象时自动调用的,不可能通过基类的指针或引用去调用。
从存储空间角度看,使用虚函数时,系统要有一定的空间开销,当一个类带有虚函数时,编译系统会为该类构造一个虚函数表(virtual function table),他是一个指针数组,存放每个虚函数的入口地址。然后还会有一个指向虚函数表的指针vptr,这个vptr指针其实是存储在对象的内存空间的,问题出来了,如果构造函数是虚的,就需要通过vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。
从使用角度看,如果不用虚函数,那么我们通过指向基类对象的指针,只能访问派生类中的基类成员,不能访问派生类增加的成员。虚函数的作用是通过指向基类的指针或引用能够访问派生类中增加的成员,而构造函数是在创建对象时自动调用的,不可能通过基类的指针或引用去调用。
相关文章推荐
- 为什么有时候需要把析构函数定义为虚函数
- AI:确定性AI
- 浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
- Linux 的cp命令
- 构造逆序数
- Eclipse高亮插件安装
- MySQL 主从复制
- FineReport构建银行金融租赁考核系统
- Android系统编译原理
- C# Excel ole文件读写操作类
- What most young programmers need to learn
- C++是怎么实现多态性的
- 自适应reset.js布局 用于手机端页面编写
- MD5 方式加密文件,判断文件是否被修改的依据:MD5值是否改变
- linux proc
- 设计模式笔记(一)--设计原则
- C++ 对象动态建立与释放
- 1063. Set Similarity (25)
- hdu 2516 取石子游戏 博弈 斐波那契数
- 架构之道