C++中基类和派生类虚函数访问权限是否合理?

fengyvn 2008-03-20 10:32:04
class Base
{
public:
virtual void func(){cout<<"Base"<<endl;}
};

class Derived: Base
{
private:
virtual void func(){cout<<"Derived"<<endl;}
};

int main()
{
Base *b = new Derived();
b->func();
}

实际调用为Derived::func();
请问这种以基类指针访问权限为准的设计有什么好处,是否破坏了派生类的访问机制?
...全文
1653 64 打赏 收藏 转发到动态 举报
写回复
用AI写文章
64 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanbo_xyz 2011-12-05
  • 打赏
  • 举报
回复
牛奔啊
logic95 2010-08-24
  • 打赏
  • 举报
回复
话说隐藏借口就是这样的吧,例如C#中:
interface IA { void S(); }
class AImp : IA { void IA.S() { } }
这样AImp就具有IA的功能,但是不能直接AImp.S();需要(AImp as IA).S();
taoll 2010-01-26
  • 打赏
  • 举报
回复
学习
seven_rain 2009-10-16
  • 打赏
  • 举报
回复
高手,学习了
M_S_D_N 2009-02-28
  • 打赏
  • 举报
回复
MARK
sowar_programme 2009-02-25
  • 打赏
  • 举报
回复
高手云集地,我到此一游
iceheart 2008-03-28
  • 打赏
  • 举报
回复
Vitin(卫亭)的人品真是让人佩服!
proxiaobai 2008-03-25
  • 打赏
  • 举报
回复
这是虚函数表只认继承模式(class XX : public XXX),不认重写作用域吧
我啃 2008-03-24
  • 打赏
  • 举报
回复
这两位又就我们理解范围外的东西吵起来了哎~
CUG122032 2008-03-24
  • 打赏
  • 举报
回复
这个问题也是OO的一大通病.
很难控制子类型的规格.

JDK里面,有些函数它不想实现,就往出抛异常.很丑陋.
taodm 2008-03-24
  • 打赏
  • 举报
回复
终于,又把GP扯出来了。
何必要把访问权限一定要去耦合在某个编程范式上来讨论它呢。
olncy 2008-03-24
  • 打赏
  • 举报
回复
强!!!我在高手中的争吵学到了东西!!对,不是争吵,是相互交流讨论.
Vitin 2008-03-24
  • 打赏
  • 举报
回复
好吧,国会的例子太遥远,GP的例子太贴近,那么再举一个例子,我说得简短一些。

比如我们每天都接触的,烹饪的例子。世界上有各种各样的菜系,中国的,外国的。单中国就分为八大菜系,还有很多小菜系。许多菜系间有一个共同点:它们都需要烹饪(如果觉得“烹饪”太中国化了,那么就是烧菜的方法,呵呵)。然后,烹饪中有很重要的一点:火候。比如大部分中国菜系都很关注火候,单单我们这些外行就知道文火、武火等等。其实对外国菜系也一样。假设现在有一个菜系(例如,法国菜;熟悉法国菜的人别骂我啊,我就一外行,借用一下它的名声而已),它不太注重火候,所有的菜都火力全开。那喜欢法国菜的人们觉得这样很好,事实上也确实很好,因为这对法国菜很合适。但是,这同样无法否定,火候对于其他菜系的重要性;以及,火候在烹饪中的重要地位。

这个例子中,烹饪即指OO,菜系即指语言,火候即指访问权限。C++可以是某个中国菜系(或其他关注火候的菜系),python可以是法国菜系。烹饪是一种方法,是一种共通的东西。对一个厨师而言,他学习和掌握的往往只是某个具体的菜系。但是,他可以与别人交流烹饪,既可以交流他所在的菜系里的烹饪技术,也可以与其他菜系的厨师——如法国厨师——交流烹饪。当厨师们聚在一起说“烹饪”时,他们都知道自己在说什么,也明白别人在说什么。他们也可以在一起交流“火候”,即使法国厨师也没有任何不适,因为火候本来就是烹饪的重要组成部分,他不会因为自己用不到就认为烹饪中就不需要这些;甚至,他需要知道自己为什么不需要火候。同时,交流的内容既可以是具体的烧菜手法,也可以是烹饪的原则、通性之类形而上的东西。厨师们知道,烹饪,以及火候,一定是体现在具体的菜系、甚或菜肴,才能看得见的;但是,只有将同性和原理抽取出来、归纳为理论,再应用到实践中,才会有更大的意义。当中国厨师和法国厨师交流时,他们的共同语言即在于此。

PS:貌似在篇幅方面,还有很大的改进空间;我要继续努力,呵呵。
Vitin 2008-03-24
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 taodm 的回复:]
终于,又把GP扯出来了。
何必要把访问权限一定要去耦合在某个编程范式上来讨论它呢。
[/Quote]
这个,不就是为了方便你理解嘛?
aizhuhui 2008-03-23
  • 打赏
  • 举报
回复
留个名, 吃过饭上来学习!
Vitin 2008-03-23
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 fengyvn 的回复:]
to Vitin
很精巧的设计,虽然跟继承的理念有点格格不入。
很有代表性,感谢。
[/Quote]
别客气,呵呵。
Vitin 2008-03-23
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 iambic 的回复:]
Vitin的回贴总是很长,taodm的回贴总是很短。
[/Quote]
我要学会长话短说,呵呵。
Vitin 2008-03-23
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 yuanchuang 的回复:]
看着好奇,用g++编译了一下,没能编译通过:
error: ‘Base’ is an inaccessible base of ‘Derived’
[/Quote]

class Derived:public Base
加上红字的部分就可以了。

iambic 2008-03-23
  • 打赏
  • 举报
回复
Vitin的回贴总是很长,taodm的回贴总是很短。
billy1985 2008-03-23
  • 打赏
  • 举报
回复
MARK
学习
加载更多回复(44)

64,659

社区成员

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

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