1

我正在开发一个序列化系统,我所有的可序列化类都实现了

virtual void serialize(Buffer buffer);

当一个指针要被序列化时,我需要调用类本身的 serialize() 函数,而不是它的任何父类的函数,即使指针是父类型,我已经遇到了很多的错误,因为我没有注意到子类甚至根本没有 serialize() 所以父 serialize() 类只是被调用

IE

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++ 中没有简单的方法可以做到这一点。

虽然有一个 hack,在这个答案中解释,使用虚拟继承并强制你的类注册serialize他们正在使用的方法。

于 2013-03-01T22:17:23.377 回答
0

在父级中使用纯虚函数:

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

在编译时,您只能通过在非最终类中使函数成为纯虚函数来做到这一点:

class A
{
    virtual void serialize() = 0;
}

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

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

当然,这意味着您设计中的所有具体类都必须是final. 如果您必须从具体类继承,则不能在编译时强制执行此操作。

于 2013-03-01T22:18:05.267 回答
0

现在,如果 C 没有序列化函数 B::serialize() 将被静默调用。

不,你会得到链接器错误。如我所见,这就是你想要的。

于 2013-03-01T22:19:18.357 回答
0

解决此问题的一种变体是不继承多个层,因此class C: public B您使用. 代替class C: public A. 当然,这不一定适用于所有场景。

迟早在某个时候,您确实必须将事情交给程序员。

也可能有一些方法可以检查这一点, - 也许创建一个临时指针B并检查是否typeid(*this) == typeid(temp)或类似?

于 2013-03-01T23:06:50.597 回答