虚函数与权限

deng2000 2007-05-17 12:34:20
虚函数算得上是C++永恒的话题之一了. 今天再来助助兴. 还是以出题的方式吧:

#include <iostream>
using namespace std;

class Base
{
public:
virtual void fun() {cout << "In Base";};
};

class Derived : public Base
{
private:
virtual void fun() {cout << "In Derived";};
};

void main()
{
Derived d;
Base* pb = &d;
pb->fun();
}

// 注意: Derived类中fun()属于private

请选择上面程序的结果

A 编译出错
B 运行出错
C 运行正常,结果为"In Base"
D 运行正常,结果为"In Derived"
...全文
856 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
lizhendi1021 2007-05-19
  • 打赏
  • 举报
回复
谢谢,通过看各位高手的解答学到了很多东西
humincq 2007-05-18
  • 打赏
  • 举报
回复
顶起!
dogygb 2007-05-18
  • 打赏
  • 举报
回复
选D~~~~不过你的Main函数还是返回一下比较好
deng2000 2007-05-18
  • 打赏
  • 举报
回复
老兄,你的C++标准在哪找到的,能否给我一份?
===========================================================================
就是鼎鼎大名的ISO 14882.可惜不能免费下载.
幸运的是,有一个稍过时版本(但对我们这种非专家来说够用了)是Free的,你可以从此处得到:
ftp://ftp.research.att.com/dist/c++std/WP/CD2/
BlueMountain_1980 2007-05-18
  • 打赏
  • 举报
回复
学习了
marrco2005 2007-05-18
  • 打赏
  • 举报
回复
谢谢楼上对我健康的关心. 虚函数与权限也不是象taodm说的那样风马牛不相及.C++标准(11.6)就是关于这个问题的:

The access rules for a virtual function are determined by its declaration and are not affected by the rules for a function that later overrides it. Access is checked at the call point using the type of the expression used to denote the object for which the member function is called. The access of the member function in the class in which it was defined is in general not known.

从这段说明看,我觉得ygzhang6516和lovejklife的理解是对的
===========================================================================
老兄,你的C++标准在哪找到的,能否给我一份?
lin_style 2007-05-18
  • 打赏
  • 举报
回复
are not affected by the rules for a function that later overrides it
mathchaos 2007-05-18
  • 打赏
  • 举报
回复
跟楼上的一样,一看就选D了,但具体为什么不太清楚....
freeman868 2007-05-18
  • 打赏
  • 举报
回复
一看到就选D,但是解释不清楚,还请老牛指点



HappyTree 2007-05-18
  • 打赏
  • 举报
回复
我觉得这道题对理解C++封装和多态还是很有帮助的,冷不丁就会中圈套。
简单的说,封装属于编译期,多态属于运行期,因此它们事实上是属于两个不同的阶段,因此编程中只要骗过了编译器,多态是不会有什么问题。
如果要更深地了解这个,《深入C++对象模型》是不错的参考书。至于讨论,我觉得晨星老大的经典帖子《从一个修改私有变量的问题想到的》值得参考。
marrco2005 2007-05-18
  • 打赏
  • 举报
回复
就是鼎鼎大名的ISO 14882.可惜不能免费下载.
幸运的是,有一个稍过时版本(但对我们这种非专家来说够用了)是Free的,你可以从此处得到:
ftp://ftp.research.att.com/dist/c++std/WP/CD2/
=================================================================================
实在是太感谢了,这种资料可不好找。最新版的好像是18美元一份。可惜咱只有人民币没有美元,想买都买不到 ^_^
deng2000 2007-05-18
  • 打赏
  • 举报
回复
关于为什么是D,C++规范以及lovejklife和HappyTree已说得比较清楚了.要点就是分清编译期和运行期是两个不同阶段.权限控制发生在编译期,多态发生在运行期.

我还想补充一点的是,这道题并不是吃多了饭没事干之人空想出来诱人入圈套的勾当(再次感谢coolage31,呵呵).把Derived中虚函数声明为private其实有着实际的用途.因为这样一来Derived::fun()只能通过Base而不能从Derived本身访问,我们可称为"纯多态方式".它对规范程序风格很有好处的.

举个最简单例子.假设我们需要写一个全局函数void invoke_fun(Base *pr)来"多态"调用fun().注意参数pr所指对象可能是Base, 也可能是Derived.
首先想到的是C++的标准写法,也是最直接的方法:

void invoke_fun(Base *pr)
{
pr->fun();
}

而我们也可用如下"C风格"的写法:

void invoke_fun(Base *pr)
{
Derived *pd = dynamic_cast<Derived*>(pr);
if (pd==NULL)
pr->Base::fun();
else
pd->Derived::fun();
}

C++教科书都反对第二种写法.但当Derived::fun()是public时,这两种写法都能通过编译,运行结果
也一致.而当我们把Derived::fun()声明为private以后,第二种方法通不过编译,我们实际上是让编译"规范"采取第一种方法.
heixia108 2007-05-18
  • 打赏
  • 举报
回复
..
ygzhang6516 2007-05-17
  • 打赏
  • 举报
回复
应该选D,
C++ 中的类的访问修饰private, protect, public, 都是在编译时检查。
当生成可运行程序时,在运行时就没有所谓的访问权限的限制。
  • 打赏
  • 举报
回复
因为 Base::fun是公有的
lidongri 2007-05-17
  • 打赏
  • 举报
回复
D 运行正常,结果为"In Derived"
星羽 2007-05-17
  • 打赏
  • 举报
回复
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
cjinc 2007-05-17
  • 打赏
  • 举报
回复
为什么啊?
我想讨教一下,我不明白啊!
  • 打赏
  • 举报
回复
D 运行正常,结果为"In Derived"
taodm 2007-05-17
  • 打赏
  • 举报
回复
2者没关系,可以说是风马牛不相及。
加载更多回复(9)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧