C/C++—— C++中构造函数不能是虚函数的原因分析
2016-04-04 14:08
330 查看
首先:到底能不能将构造函数声明为虚函数?
答案是不能。先看下面例子的编译结果。#include <iostream> using namespace std; class Parent { public: virtual Parent(int a = 0) { this->a = a; } virtual void print() { cout<< "Parent." <<endl; } private: int a; }; class Child : public Parent { public: Child(int b = 0) { this->b = b; } virtual void print() { cout<< "Child."<<endl; } private: int b ; }; int main() { Parent p; return 0; }
编译输出结果:
error: constructors cannot be declared virtual [-fpermissive]
virtual Parent(int a = 0)
提示构造函数不能声明为虚函数。。
分析原因:
首先参考博客:C/C++—— C++编译器是如何实现多态先了解vptr指针和虚函数表的概念,以及两者的关系。
vptr指针指向虚函数表,执行虚函数的时候,会调用vptr指针变量指向的虚函数表中的虚函数。
当定义个对象的时候,首先会分配内存空间,然后再执行构造函数对该对象进行初始化构造。vptr变量是在构造函数中进行初始化的。又因为要想执行虚函数必须通过vptr变量找到虚函数表。(在构造函数初始化vptr变量之前是不会调用虚函数的)如果可以定义虚构造函数,就陷入了先有鸡还是先有蛋的问题。
所以不能将构造函数声明为虚函数。
相关文章推荐
- C++ error: default argument given for parameter 1
- Count Primes
- 左旋转字符串m位
- CSP考试 2013年12月第3题 最大矩形 C语言实现
- 设计模式C++工厂模式
- C++的tie()函数
- [C++]字符串流 istringstream 和 ostringstream 的用法
- C/C++—— 在构造函数中调用虚函数能实现多态吗(Vptr指针初始化的过程分析)
- C++:标准IO(输入输出)
- C/C++—— C++编译器是如何实现多态
- c语言中宏定义和函数区别
- C++ vector::resize
- Count Primes
- C++ set_union
- VC++执行多条dos命令方法
- C++ inserter
- 30.C语言结构体对齐访问
- 【算法】蛇形矩阵
- Ugly Number II(求第N个丑数)
- C语言标识符