下面程序的运行结果是derived。
我们知道C++在实现多态时, 其父类和子类的虚函数都因该是public,而下面代码中derived类中的fn是private,而且私有函数是不能在对象的成员函数外掉用的,而下面的程序可以执行并且成功实现多态,这因该是不允许的。
为什么编译器能通过呢?因为base* p在编译时不能确定它所调用的是父类的公有fn还是子类的私有fn,编译器就无法检查出语法错误,而且由于p指向的对象中的vpter(虚表指针)指向的是derived类的虚表,所以用p掉用的虚函数fn,因该是derived类的fn。
总的来说,下面的程序是可以实现多态的,但是由于子类的fn是private,语法上应该不允许,但是编译运行却可以通过。
#include
#include
using namespace std;
class base
{
public:
virtual void fn()
{
cout<<"base"< }
};
class derived:public base
{
private:
void fn()
{
cout<<"derived"< }
};
int main()
{
base* p;
derived it;
p=⁢
p->fn();
system("PAUSE");
return EXIT_SUCCESS;
}
--------------------next---------------------
阅读(1105) | 评论(0) | 转发(0) |