#include <iostream>
using namespace std;
class Base {
public:
void fun1(){cout<<"Base\n";}
virtual void fun2(){cout<<"Base\n";}
};
class Derived:public Base {
public:
void fun1(){cout<<"Derived\n";}
void fun2(){cout <<"Derived\n";}
};
void f(Base& b){b.fun1();b.fun2();}
void main() {
Derived obj;
f(obj);
}
为什么是结果是:
Base
Derived
首先声明了obj是一个派生类类型(记住这是实际类型)
调用f(obj);时,obj被强制转换成Base类型,调用b.fun1();时Base类中fun1函数没有virtual关键字,编译器不知道调用实际类型Derived中的fun1,所以调用了Base类中的,调用fun2时,有了关键字virtual,编译器会在虚表中找obj的实际类型对应的函数,就是Derived中的fun2.
调用f(obj);时,obj被强制转换成Base类型,调用b.fun1();时Base类中fun1函数没有virtual关键字,编译器不知道调用实际类型Derived中的fun1,所以调用了Base类中的,调用fun2时,有了关键字virtual,编译器会在虚表中找obj的实际类型对应的函数,就是Derived中的fun2.
温馨提示:答案为网友推荐,仅供参考
第1个回答 2011-10-21
不客气