我正在开发一个序列化系统,我所有的可序列化类都实现了
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)可以做到这一点?
答案 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)
或某些?