关于对基类protected方法进行访问的问题

fly___fly 2009-09-23 12:04:11

class A
{
public:
A(){};
~A(){};
protected:
virtual void Fun(){};
}

class B : public A
{
public:
B();
~B();
protected:
A * a;
virtual void Fun()
{
a->Fun(); /* 此处这么写会出错,有没有解决的办法? */
}
}



如上,不能改变基类A的内容。
a 指向的可能是A的其他派生类。

有办法么?
...全文
114 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengchuanzhou 2009-09-23
  • 打赏
  • 举报
回复
这样实现没有什么道理,说明你的目的?
fly___fly 2009-09-23
  • 打赏
  • 举报
回复
6楼的办法与A::fun()无甚区别
fly___fly 2009-09-23
  • 打赏
  • 举报
回复
3楼说的倒是有道理。

6楼是什么意思能说得明白些么?

11楼完全没办法么?
xxzsly 2009-09-23
  • 打赏
  • 举报
回复
这个不太好办啊
aopha 2009-09-23
  • 打赏
  • 举报
回复
如上,不能改变基类A的内容。
a 指向的可能是A的其他派生类。

有办法么?

不行。
whg01 2009-09-23
  • 打赏
  • 举报
回复
A::Fun();这么用可以。试过了。
  • 打赏
  • 举报
回复
你的目的是什么,这样还需要虚函数吗?
ysuliu 2009-09-23
  • 打赏
  • 举报
回复
派生类别用protected,用public
taodm 2009-09-23
  • 打赏
  • 举报
回复
做正确的事,改基类代码。
forster 2009-09-23
  • 打赏
  • 举报
回复
__super::Fun();
cattycat 2009-09-23
  • 打赏
  • 举报
回复
A::Fun()就行。
当然3楼解释的更清楚。
cattycat 2009-09-23
  • 打赏
  • 举报
回复
A::Fun()就行。
当然3楼解释的更清楚。
cphj 2009-09-23
  • 打赏
  • 举报
回复
1、2楼不符合楼主要求

楼主要求“a 指向的可能是A的其他派生类。”

而正是因为实际编译的时候“a 指向的可能是A的其他派生类”,所以编译器不会让a->Fun();编译通过

比如说C也是A的派生类,而a指向C的一个对象,这时候a->Fun();实际调用的是C的Fun(),而C的Fun()不出意外的话也是定义成protected的,而B类的成员Fun()是没有权利访问C类的保护成员的(B类的成员只能访问其基类A的保护成员)
TianYiXiang 2009-09-23
  • 打赏
  • 举报
回复
A::Fun();
pengzhixi 2009-09-23
  • 打赏
  • 举报
回复
a->A::Fun();
forster 2009-09-23
  • 打赏
  • 举报
回复
还是不清楚楼主的目的。。
fly___fly 2009-09-23
  • 打赏
  • 举报
回复
找到替代方案了。。

在A与B之间再加一层类,把Fun公开了。

没办法了。。郁闷
huqinglu123 2009-09-23
  • 打赏
  • 举报
回复
楼主的目的是为了什么啊
如果你要调用基类的成员函数就用A::fun()
a 指向的可能是A的其他派生类。 要在B类里实现a->fun()就难了
a是指向基类的指针,通过虚函数来实现多态性,在运用的时候是可以实现a指向A的其他派生类的对象,但在B类里就不行

64,654

社区成员

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

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