0

5 つのサブクラスを持つ基本クラスがあります。

私の基本クラスにこれがある場合:

virtual CpuPort &getsecondDataPort()=0;

これは、すべてのサブクラスに対してメソッドを実装する必要があることを意味しますよね?

しかし、特定のサブクラスのオブジェクトがある場合にのみそのメソッドを呼び出すことがわかっているので、私はそれを望んでいないので、代わりにこれを書くことができると思いました:

virtual CpuPort &getsecondDataPort();

必要なサブクラスにのみ実装します。しかし、それは私にこのエラーを与えます:

/base.cc:254: undefined reference to `vtable for BaseCPU'

および他のサブクラスから:

undefined reference to `typeinfo for BaseCPU'

BaseCPU は基本クラスのオブジェクトです。

これはより大きなライブラリ (実際にはシミュレーター) の一部であるため、できるだけ変更を少なくしたいと考えています。したがって、これが問題を解決する唯一の方法でない限り、これまでのコードの編成方法に従いたいので、「サブクラスでのみ定義する」などの提案はしないでください。

なぜそれが起こるのかについて何か考えはありますか?

ありがとう

4

3 に答える 3

3

これは、すべてのサブクラスに対してメソッドを実装する必要があることを意味しますよね?

これらのサブクラスの直接のインスタンスを作成する場合のみ。サブクラスが純粋仮想関数を実装していない場合、それは抽象的になり、それ自体は許可されます。

しかし、それは私にこのエラーを与えます:

これは、仮想関数が宣言されているが、定義されていないためです。関数が純粋仮想でない場合は、定義を提供する必要があります。

この場合、何もしないダミーの実装を提供することはできません。これは、関数が参照を返すことになっており、値を返す関数の最後から何も返さずに流れることは、パラグラフ 6.6.3/2 の未定義の動作であるためです。 C++11 標準。

CpuPort一方、基本クラスに(say) という型のデータ メンバーがある場合はmyCpuPort、次のようにすることができます。

virtual CpuPort &getsecondDataPort() { return myCpuPort; }
于 2013-04-20T13:23:03.830 に答える
1

唯一の解決策は、基本クラスに空の実装を提供することです (制約を考慮して)。

次のシナリオについて考えてみてください。

 struct Base
 {
    virtual void foo() = 0;
 };
 struct Derived1
 {
 };
 struct Derived2
 {
    virtual void foo() {};
 };

 Base* p1 = new Derived1;
 Base* p2 = new Derived2;
 p1->foo();
 p2->foo();

コンパイラがこのコードを通過させたとしましょう (そうではなく、それは良いことです)。2 回目の呼び出しではどうなりますか?

于 2013-04-20T13:21:02.947 に答える
1

メンバー関数を宣言しましたが、定義していません。の実装を提供する必要がありますgetsecondDataPort

CpuPort& BaseCPU::getsecondDataPort()
{
     return somevar_;
}
于 2013-04-20T13:22:44.100 に答える