在A class对象的base class构造期间,对象的类型是base class,而不是A class,不只是virtual函数会被编译器解析至base class,若运行期间类型信息,例如dynamic_case 和typeid,也会把对象视为base class类型。相同道理也适用析构函数。
1 #include <windows.h> 2 #include <iostream> 3 using namespace std; 4 5 class Base 6 { 7 public: 8 Base() 9 { 10 OPe(); 11 } 12 13 virtual ~Base() 14 { 15 OPe(); 16 } 17 18 virtual void OPe() 19 { 20 cout << "Base::Fuction" << endl; 21 } 22 }; 23 24 class A : public Base 25 { 26 public: 27 A() 28 { 29 OPe(); 30 } 31 32 virtual ~A() 33 { 34 OPe(); 35 } 36 37 virtual void OPe() 38 { 39 cout << "A::Fuction" << endl; 40 } 41 }; 42 43 // 这样定义一个A的对象,会输出什么? 44 int main() 45 { 46 {A a;} 47 system("pause"); 48 return 0; 49 }
输出结果: