class A { public: void foo() { printf("1"); } virtual void fun() { printf("2"); } }; class B: public A { public: void foo() { printf("3"); } void fun() { printf("4"); } }; int main(void) { A a; B b; A *p = &a; p->foo(); p->fun(); p = &b; p->foo(); p->fun(); A *ptr = (A *)&b; ptr->foo(); ptr->fun(); return 0; }
1,首先声明为A类型的指针指向实际类型为A的对象,调用的肯定是A的方法,输出1 2,
2,然后声明为A类型的指针指向实际类型为B的对象,则非虚函数调用A的方法,输出1,虚函数调用实际类型B的方法,输出4
3,声明类型为A的指针指向实际类型为B的对象,进行一个强制类型转换,其实这种父类指针指向子类会自动进行类型转换,所以是否强制类型转换都不影响结构,原理同上一步,结果输出1 4
所以最终输出为121414