标签:
参考网址:
http://blog.csdn.net/hackbuteer1/article/details/7475622
http://blog.csdn.net/j123kaishichufa/article/details/9841261
如下代码:
1 #include<iostream> 2 using namespace std; 3 4 class A 5 { 6 public: 7 void foo() 8 { 9 printf("1\n"); 10 } 11 virtual void fun() 12 { 13 printf("2\n"); 14 } 15 }; 16 class B : public A 17 { 18 public: 19 void foo() 20 { 21 printf("3\n"); 22 } 23 void fun() 24 { 25 printf("4\n"); 26 } 27 }; 28 29 int _tmain(int argc, _TCHAR* argv[]) 30 { 31 A a; 32 B b; 33 34 A *p = &a; 35 p->foo(); 36 p->fun(); 37 p = &b; 38 p->foo(); 39 p->fun(); 40 41 B *ptr = (B *)&a; 42 ptr->foo(); 43 ptr->fun(); 44 45 return 0; 46 }
在VS2013上结果如下:
1 2 1 4 3 2
解释:
在继承层次中,存在向上指针类型转换或者向下类型转换,则调用成员函数(两个类都实现了)调用的是哪个类的函数,遵循下面2个规则:
(1)调用虚函数时,因为是动态绑定,所以根据指针指向的对象的实际类型来决定。
(2)调用非虚函数,静态决定,所以根据表面山看到的类的类型来决定。
标签:
原文地址:http://www.cnblogs.com/darkknightzh/p/4380108.html