问题 填空题

下列程序的运行结果是 【12】 。 #include<iostream. h> class Base { public:virtual void func(int i){cout<<"class Base:"<<i<<endl;} }; class Derived: public Base { public: void func(double d){cout<<"class Derived:"<<d<<endl;} ); void main() { Base a, *p=&a; Derived b; p=&b; (* p).func(3.3); }

答案

参考答案:class Base:3

解析: 题中基类和派生类中有同名函数.但是参数不同。有的考生可能判断为重载.却是错误的。重载仅发生在水平方向,即同一类的成员函数或全局函数间。在垂直关系上,即派生关系中,只有完全相同的函数类型、函数名和参数个数,参数类型时,才表现多态性。本题中参数不同,编译器便认为是两个完全不同的函数。通过基类的指针指向派生类对象时,该指针只能访问到派生类中具有多态性的成员函数,而与基类无关的函数是无法通过基类指针来访问的。故系统强制转化为整型,调用的是base类的func函数。如果将派生类中的func的形参改为int型,则执行的就会是派生类的func函数,此时表现为多态。

选择题
多项选择题