派生类构造函数中调用基类虚函数,能够发生多态?-(否)
2018-02-27 11:38
447 查看
#include<iostream> using namespace std; class A{ public: A(int a) :a(a) { cout << "constructor A :" << a << endl; test1(); test2(); } void test1(){ cout << "Class A :" << a << endl; } virtual void test2(){ cout << "Class A Virtual:" << a << endl; } protected: int a; }; class B :public A{ public: B(int b) :A(b) { cout << "constructor B :" << a << endl; test1(); test2(); } void test1(){ cout << "Class B :" << a << endl; } void test2(){ cout << "Class B Virtual:" << a << endl; } }; int main() { cout << "==========0=========" << endl; A a(10); cout << "==========1=========" << endl; B b(20); A *ptr = NULL; cout << "==========2=========" << endl; ptr = &a; ptr->test1(); ptr->test2(); cout << "==========3=========" << endl; ptr = &b; ptr->test1(); ptr->test2(); return 0; }执行结果为:
从结果中可以看出,派生类B在构建时,基类A的构造函数中的虚函数调用的是基类的函数test2(),而没有调用派生类B的test2()函数;
为什么会出现这个现象呢?因为这个跟vptr指针有关系,因为对象的vptr指针是在实例创建完成后再赋值具体的实例虚函数表,在派生类B构建过程中,首先调用的是A类的构造函数,而此时B类还未构建完成,此时调用的虚函数test2()还是A类的虚函数。
因此在派生类构造函数中调用的虚函数不表现出多态性。
相关文章推荐
- C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- 多态继承情况下,有一个基类指针指向派生类对象,如何用它调用基类的虚函数?
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- C++如何在派生类成员函数内调用基类的成员函数(包括构造函数)
- 关于基类构造函数调用虚函数实际调用的不是派生类的问题的原因
- 转 关于C#中派生类调用基类构造函数的理解
- C++:派生类的默认构造函数和拷贝构造函数调用基类构造函数的机制(含程序验证)
- 基类和派生类构造函数函数执行顺序
- 关于派生类构造函数与基类构造函数的调用顺序问题
- 基类和派生类的构造函数,隐式调用与显式调用
- 构造函数和析构函数在基类和派生类之间的调用顺序
- C++虚函数的陷阱--派生类对象的基类函数调用基类虚函数出错
- 关于C#中派生类调用基类构造函数的理解[转]
- 【牛客 题库】 求字符串长度和大小 || 基类和派生类的构造函数,隐式调用与显式调用 || 数组下标的数据类型
- 派生类的构造函数 与基类的调用关系
- 关于派生类构造函数与基类构造函数的调用顺序问题
- 构造函数访问权限和基类构造函数,派生类的构造函数调用顺序
- C/C++—— 在构造函数中调用虚函数能实现多态吗(Vptr指针初始化的过程分析)
- 派生类和基类的函数调用
- 使用派生类对象通过成员函数指针调用基类虚函数之不可能性的证明