3

フレンド(+子)クラスのネストされたクラスの仮想関数をオーバーライドしたい。これはどのように可能ですか?これが私が試したことです:

class Parent {
  friend class Child;
  class Nested {
    public: virtual void nestedfunc() {std::cout << "one";}
  }
};
class Child : Parent {
  void Child::Nested::nestedfun() {std::cout << "two";}
}

しかし、私は得ます:

error: cannot define member function 'Parent::Nested::nestedfunc' within 'Child'

(「子::」がない場合も同じエラー)

4

3 に答える 3

10

オーバーライドが進むにつれて、クラスを拡張してからオーバーライドする必要があります。

class Parent {
  friend class Child;
  class Nested {
    public: virtual void nestedfunc() {std::cout << "one";}
  }
};
class Child : Parent {
  class ChildNested : Parent::Nested
  {
    public: virtual void nestedfunc() {std::cout << "two";}
  }
}

内部クラスはそれほど特別なものではありません。継承のルールに違反したり、メソッドをオーバーライドできるが、メソッドを宣言するクラスから派生したりすることのできない特別な魔法を提供することはありません。

于 2012-07-12T09:33:53.037 に答える
2

基本的に、以下に示すように子で別のクラスを派生させ、そこに仮想関数を実装する必要があります。

class Parent 
{
  friend class Child;
  class Nested {
    public: virtual void nestedfunc() {std::cout << "one";}
  };
};

class Child : Parent 
{

    //derive a new class in the child to override the virtual function.
    class ChildNested : public Parent::Nested
    {
       void nestedfun() {std::cout << "two";}
    };
};
于 2012-07-12T09:34:55.423 に答える
1

派生クラスの基本クラスの仮想関数を上書きできます。内部クラスは別のクラスです。内部クラスから派生するクラスを作成する必要があります。そんな感じ:

class Child : Parent::Nested {
  void nestedfun() {std::cout << "two";}
}
于 2012-07-12T09:33:36.910 に答える