我有一个抽象类AUnit,带有变量和getters / setter,虚拟纯粹像这样
class AUnit {int var... int getVar() const = 0 ... }
所有数据都受保护:构造函数和析构函数除外。
我有像这样的孩子Berserk和坦克
class Berserk : public AUnit
{
...
private:
int getVar() const;
在他们的.cpp中,我编写了getter和setter的代码。没什么特别的。
但我有另外一个类(例如foo),比如这个
class Foo : public Berserk, public Tank
谁需要访问Berserk或Tank中的数据,所以我通过protected更改了private关键字,这里是错误:
Tank.hpp:36:25: erreur: ‘virtual int Tank::getY() const’ is protected
error inside the context
首先,我只是尝试使用AUnit getter访问数据但是导致虚拟纯粹和抽象概念,我想在非纯粹和公开传递AUnit的getType之后,以他的真实类型重新解释我的AUnit。它仍然没有用,它是我之前告诉你的方案。
这只是古典遗产,我可以帮忙吗?
答案 0 :(得分:1)
你的代码剪断肯定是不完整的。我的猜测是你有这样的东西:
int Foo::f(Tank const* tank) {
return tank->getY();
}
(可能,你正在做一些有价值的东西而不是回归它)。
即使Tank::getY()
的访问权限为protected
,上述代码中的Foo
类也无法访问getY()
,因为{{1}指向的对象不知道是tank
对象:一个类只能访问自己类型的基础对象中的Foo
成员!也就是说,以下情况可以:
protected
到目前为止,我在int Foo::f(Foo const* foo) {
return foo->getY();
}
protected
成员函数中找到了唯一的好处,它在基类中具有合理的非平凡实现,并且从[其他]派生类调用作为覆盖会员的一部分。通过这种方式,可以添加功能并使用通用逻辑(当然,任何virtual
功能不 virtual
,而是public
或{{1 }})。
答案 1 :(得分:0)
为覆盖函数提供比它覆盖的函数更严格的访问保护通常是一个坏主意。考虑:
class Base {
public:
virtual void f() {}
};
class Derived : public Base {
private:
virtual void f() {} // overrides Base::f
};
Derived d;
d.f(); // error - f is private
Base* pb = &d;
pb->f(); // OK - calls d.f()
为了避免这种悖论,谨慎的做法是将覆盖设置为与原始访问级别相同的访问级别(或更宽松的访问级别,尽管这有点不寻常)。