0

私が持っている場合、関数をオーバーライドする方法について混乱しています

class  C
{
  public:
    C ();
};


class A: public C
{
  public:
    virtual string write()=0;
};

そして私は別のクラスを作ります

class B: public A
{
    public:
       string B :: write() override {}
};

これは、クラス A の仮想メソッドを継承してオーバーライドするクラス B には無効ですか?

わかりましたので、メインでは、この抽象クラスのコンストラクターを正しく呼び出すことは許可されていませんか? しかし、その抽象クラスに継承されたコンストラクターがある場合、どうすればそれらを呼び出すことができますか?

void main()
{
   B();
}
4

3 に答える 3

0

これは、クラス A の仮想メソッドを継承してオーバーライドするクラス B には無効ですか?

冗長な(そして違法な)ものを落として、B::何かを返す必要があります。それ以外の場合は問題ありません。

この抽象クラスのコンストラクターを正しく呼び出すことはできませんか? しかし、その抽象クラスに継承されたコンストラクターがある場合、どうすればそれらを呼び出すことができますか?

コンストラクターを直接呼び出すことはできません。それは言語の仕組みではありません。コンストラクターは、オブジェクトを作成するときに間接的に呼び出されます。

B b;  // Create an instance of B, indirectly calling B::B(), which calls A::A()

は抽象的であるためA、その型のオブジェクトを作成することはできません。Bすべての純粋仮想関数をオーバーライドするような派生型のみ。

于 2013-10-31T07:02:31.483 に答える
0

ここで ( C++11overrideで利用可能)を指定したい場合は、このようにすることができます。

ヘッダーファイル

class B : public A {
 public:
  virtual string Write() override;
}

CPP ファイル

string B::Write() {
// Your implementation here.
}

実際、それoverrideが実際の意図である場合を指定することをお勧めします。でオーバーライドしようとするなどのエラーを回避しますstring A::Write()string B::Write() const、2 番目の関数を定義した結果を取得します。この場合、 を指定するstring B::Write() const overrideとコンパイルエラーになります。

于 2013-10-31T04:55:45.837 に答える
0

別のクラスから継承するための構文は、次のようになります。

class B: public A{
   public:
      virtual string write(){
        //do something
        return someString;
      }
};
于 2013-10-31T04:44:08.950 に答える