Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2341306
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:07:39

下面程序的运行结果是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---------------------

阅读(1101) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~