1

私はシリアル化システムに取り組んでおり、すべてのシリアル化可能なクラスは実装しています

virtual void serialize(Buffer buffer);

ポインターをシリアル化するときは、ポインターが親型であっても、クラス自体のserialize()関数を呼び出す必要があり、その親の関数を呼び出す必要はありません。子クラスにserialize()がまったくないことに気づかず、親のserialize()クラスが呼び出されているだけなので、バグが多くあります。

すなわち

class A
{
    virtual void serialize();
}

class B:public A
{
    virtual void serialize();
}

class C:public B
{
    virtual void serialize();
}

void doSerialization(A *a)
{
    a->serialize();
}


C *c=new C();
doSerialization(c);

現在、Cにシリアル化関数がない場合、B :: serialize()がサイレントに呼び出されます。私はエラーメッセージ、または少なくともそれを私に指摘する何か他のものを好みます。これを行うC++('11でも)のキーワードはありますか?

4

5 に答える 5

1

C++ でこれを行う簡単な方法はありません。

ただし、この回答で説明されているハックがあり、仮想継承を使用し、クラスが使用しているメソッドを強制的に登録します。serialize

于 2013-03-01T22:17:23.377 に答える
0

これを解決する 1 つの方法は、複数のレイヤーを継承しないことです。そのため、 の代わりにclass C: public Bを使用しますclass C: public A。もちろん、それは必ずしもすべてのシナリオに対する提案ではありません。

遅かれ早かれある時点で、プログラマーの手に物事を任せなければなりません。

これを確認する方法もいくつかあるかもしれません - 一時的なポインタを作成して、そのようなものかBどうかを確認してください。typeid(*this) == typeid(temp)

于 2013-03-01T23:06:50.597 に答える
0

親で純粋仮想関数を使用する:

virtual void serialize(Buffer buffer) = 0;
于 2013-03-01T22:17:28.493 に答える