需要覆盖父虚函数

时间:2013-03-01 22:09:15

标签: c++

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

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)可以做到这一点?

5 个答案:

答案 0 :(得分:1)

在C ++中没有 easy 方式。

是一个hack,在this answer中解释,使用虚拟继承并强制您的类注册他们正在使用的serialize方法。

答案 1 :(得分:0)

在父级中使用纯虚函数:

virtual void serialize(Buffer buffer) = 0;

答案 2 :(得分:0)

在编译时,你只能通过在非最终的类中使函数成为纯虚函数来实现这一点:

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

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

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

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

答案 3 :(得分:0)

  

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

不,您将收到链接器错误。我认为,这就是你想要的。

答案 4 :(得分:0)

要解决此问题的一个变体是不继承多个图层,因此使用class C: public B而不是class C: public A。当然,这不一定是所有场景的建议。

迟早,你必须把事情交给程序员。

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