0

このような仮想純粋な変数とゲッター/セッターを持つ抽象クラス AUnit があります

class AUnit {int var... int getVar() const = 0 ... }

コンストラクタとデストラクタを除くすべてのデータは保護されています。

ベルセルクとタンクが子供の頃にこんな風に

class Berserk : public AUnit
{
...
private:
int getVar() const;

彼らの .cpp に、ゲッターとセッターのコードを書きます。特にない。

しかし、私はこのような別のクラス(たとえばfoo)を持っています

class Foo : public Berserk, public Tank

誰が Berserk または Tank のデータにアクセスする必要があるので、プライベート キーワードを protected に変更しました。エラーは次のとおりです。

Tank.hpp:36:25: erreur: ‘virtual int Tank::getY() const’ is protected
error inside the context

最初に、AUnit ゲッターを使用してデータにアクセスしようとしましたが、仮想の純粋で抽象的な概念が原因で、AUnit の getType を非純粋でパブリックに渡した後、AUnit を実際の型で再解釈_キャストすることを考えました。まだ機能していません。以前にお話ししたスキームです。

それは単なる古典的な遺産です。何か助けてもらえますか?

4

2 に答える 2

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()

このようなパラドックスを回避するには、オーバーライドをオリジナルと同じアクセス レベル (または、より緩和されたアクセス レベルですが、これは少し珍しいことです) に設定するのが賢明です。

于 2013-07-26T23:09:58.650 に答える