0

Borland C++ Builder でコントラクト クラスを実装しようとしていますが、理解できないコンパイル エラーが発生します。コードは次のようになります。

class baseClass2 {
  public:
    virtual void test () = 0;
};

class derivedClass: public baseClass2 {
  derivedClass () {test ();};
};

void baseClass2::test () {

};

アリはコンパイルしますが、私はそれを信じています

ボイド baseClass2::test ()
派生クラスにある必要があります。ここに置くと、

[C++ エラー] multiple_inheritance.cpp(33): E2316 「派生クラス::テスト ()」は「派生クラス」のメンバーではありません

なぜ私はこれを手に入れたのですか?ありがとう!

4

3 に答える 3

0

これは非常に微妙です。派生コンストラクターが、祖先クラスのいずれかで virtual と宣言された関数を呼び出す必要がある場合 (直接または別のメンバー関数を介して (そのため、見つけるのが非常に難しい場合があります))、基本クラスで実装を呼び出します。これは、仮想関数をオーバーライドした場合でも発生します。

これは、あなたの場合derivedClass::derivedClass()、純粋な仮想を呼び出すことを意味しますbaseClass2::test()。イーク!

はい、これが C++ の仕組みです。派生 vtable ポインターは、コンストラクターにいる間、基本クラスの vtable を指します。コンストラクタを離れたときにのみ更新されます。

于 2012-09-20T08:44:57.890 に答える
0

ボイド baseClass2::test ()

test()で既に仮想関数として宣言しているため、これは正しくありませんbaseClass2

派生クラスにある必要があります

derivedClassそれを行う前に、次のように定義で宣言する必要があります。

class derivedClass: public baseClass2 {
public:
    derivedClass () {test ();};
    virtual void test();
};

void derivedClass:test() {

}

test()次に、派生クラスのコンストラクターを呼び出すことができます。

于 2012-09-19T17:44:32.443 に答える
0

の基本クラスの実装test()は純粋仮想です。基本クラスに実装を提供することは合法ですが、派生クラスにも別の実装を提供する必要があります ( derivedClassを具象クラスにしたい場合)。

class baseClass2 {
public:
    virtual void test () = 0;
};

class derivedClass: public baseClass2  {
public:
    derivedClass() { test(); }
    void test();
};

void baseClass2::test () {
}

void derivedClass::test () {
} 
于 2012-09-19T17:48:20.027 に答える