私有的纯虚函数,子类能重写么?

cutenoob 2007-01-07 03:29:24
在看代码的时候出现这种情况

class Base
{
private:
virtual void why()=0;
};

class Drive_first : public Base
{
public:
virtual void why(){do something};
};

我们知道基类如果有纯虚函数,子类继承的时候需要重写掉她,可是这种情况算不算重写掉基类的why()函数?

-----
其实我最想知道的是在什么样的设计思想下趋势出来了这种代码? 是为了基类的抽象性么?
...全文
855 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
rwujie 2007-01-07
  • 打赏
  • 举报
回复
说简单一点,就是在父类中还不确定一个函数要实现什么功能(但是这个函数又是必须的),在子类中再具体说明他需要实现的功能,就可以使用纯虚函数。比如一个人需要运动,但是运动的方式很多,就可以先在父类设置一个纯虚函数VIRTUAL VOID SPORT()=0,在子类中就可以具体说明SPORT的方式。
houdy 2007-01-07
  • 打赏
  • 举报
回复
其实我最想知道的是在什么样的设计思想下趋势出来了这种代码? 是为了基类的抽象性么?
-----
我觉得并不是为了基类的抽象性,因为纯虚函数已经可以描述抽象性了,比如Java中的接口在C++中就可以通过只包含纯虚函数的类来模拟。

具体这样做的目的我也不是太清楚,但是我们分析一下这样做的后果,看看能不能反推出这样做的目的(或者是无目的的)
1.纯虚函数的设计说明这个类是个抽象基类,派生类必须重写(或者说实现)这个纯虚函数才可能被实例话,否则派生类仍然是个抽象基类。
2.将纯虚函数设为private,说明这个纯虚函数并不是一个接口函数,外界不能通过抽象基类指针直接调用。
由此可以想像,这个私有纯虚函数可能是为公共接口服务的。
haidaodiege 2007-01-07
  • 打赏
  • 举报
回复
私有只是让子类不能访问父类,仅此而已,对其他规则没限制,也就是说那是重写。
v2002750 2007-01-07
  • 打赏
  • 举报
回复
是重写,虚函数的查找是根据虚函数表来的,虚函数表不管什么private和public
所谓private方法,是不作为对外访问接口的。
比如下面的类层次结构,黑人和白人发音的方式不同,导致他们唱歌方式不同,但是对外接口只有唱歌:
class people{
public:
virtual void sing()=0;
private:
virtual void sound()=0;
};

class white:public people{
public:
void sing(){sound();}
private:
void sound(){}
};

class black:public people{
public:
void sing(){sound();}
private:
void sound(){}
};
xuejinn 2007-01-07
  • 打赏
  • 举报
回复
mark
cutenoob 2007-01-07
  • 打赏
  • 举报
回复
呵呵,,大家分析的都很正确啊!! 谢谢你们了!

以后可以这么设计了

class people
{
public:
inline void sing(){song()};
private:
virtual void song()=0;
};

class white : public people
{
public:
void song(){white people song}
};

class black : public people
{
public:
void song(){black people song};
};

-----

这样的话只需要重写自己的那部分,然后根据不同对象的调用来执行各自的song()函数 多态嘛
iambic 2007-01-07
  • 打赏
  • 举报
回复
支持楼上。

另外Java里面好像是不能覆盖私有方法的。
genius_hb 2007-01-07
  • 打赏
  • 举报
回复
为了提供更为强健的基类接口.
基类中的接口一般一个非虚的普通函数,其内部实现通过调用一个私有虚函数来实现.子类可以改写该私有虚函数,而不会理会公有的接口.
有点类似template method
  • 打赏
  • 举报
回复
可以重写的。

65,183

社区成员

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

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