虚拟函数问题

beginnerworld 2006-06-29 09:44:56
各位高手,我刚刚接触虚拟函数,遇到问题:
class base{
public:
virtual void test(){
cout << "base" << endl;
}
};

class derived : public base{
private:
virtual void test(){ //这里在private内重新定义虚拟函数
cout << "derived" << endl;
}
};
void main(){
base *pb = new derived;
pb->test(); //编译成功
}

我在派生类derived里面将虚拟函数重新定义于private区域内,所以应该无法被程序调用,但是上面却运行成功,显示:derived。

不知道为什么?哪位大侠明白,拜托给我讲一讲,谢谢!
...全文
184 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
beginnerworld 2006-06-30
  • 打赏
  • 举报
回复
谢谢各位了,我懂了!
尤其感谢OOPhaisky(渴望成功),你的解释精辟之至。

本贴加分,来者有分!!
lyskyly 2006-06-30
  • 打赏
  • 举报
回复
#include<iostream>

using namespace std;

class Base
{
public:
virtual ~Base(){}
virtual void DoSomeThing() const
{ cout<<"Base::DoSomeThing"<<endl;}
};

class Derived:public Base
{
private:
void DoSomeThing() const;//////////仅仅将它重新声明到private中

};
int main()
{
Base *pb = new Derived;
pb->DoSomeThing();
delete pb;

Derived d;
d.DoSomeThing();//error
}

有时即使不用重定义虚函数也需要将派生类中的虚函数重新声明到private中
,防止用户以为那是公有接口,可以随便调用
KennyLiu 2006-06-29
  • 打赏
  • 举报
回复
关注。
晨星 2006-06-29
  • 打赏
  • 举报
回复
这倒是迫使用户必须从基类来调用接口的办法
——同意。
herman~~ 2006-06-29
  • 打赏
  • 举报
回复
关注
howyougen 2006-06-29
  • 打赏
  • 举报
回复
这倒是迫使用户必须从基类来调用接口的办法
howyougen 2006-06-29
  • 打赏
  • 举报
回复
mark
晨星 2006-06-29
  • 打赏
  • 举报
回复
嗯,就是这样吧。
C++语言并不限制子类把访问权限narrow一把。
如果是JAVA,碰到这种情况,且不管main函数是否有问题,还没编译完那个子类,就已经报错了。
Improving 2006-06-29
  • 打赏
  • 举报
回复
同意楼上的观点!
du51 2006-06-29
  • 打赏
  • 举报
回复
顶楼上的.看法完全一样.
OOPhaisky 2006-06-29
  • 打赏
  • 举报
回复
public,protected和private是编译时刻的概念,即编译器在编译时刻根据变量的静态类型判断成员访问权限是否合法;而virtual函数是运行时刻的概念,即只有到运行时刻才能确定需要调用哪个函数。

所以对于你的问题,编译器会对“pb->test();”执行“静态”的权限检查,即根据pb的静态类型判断此调用是否合法,而pb的静态类型是base *(多说一句,其实pb这个指针的动态类型也是base *,只不过"*pb"的动态类型是derived,你可以用typeid试验一下,但此处你可以不管这么多,简单地理解就可以了),在base类中,test是public的,完全可以调用,所以编译通过。过了编译这一关之后,public,protected和private就不再起作用了,所以程序可以成功地显示“derived”。

以上仅是个人观点,等待高人纠正。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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