2013-03-01 156 views
1

我的工作序列化系统的覆盖,和我所有的序列化类实现要求父虚拟功能

virtual void serialize(Buffer buffer); 

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

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)会这样做?

回答

1

有没有容易在C++中这样做的方式。

一个黑客虽然在this answer解释说,使用虚拟继承,迫使你的类注册其serialize方法,他们正在使用。

0

使用纯虚函数父:

virtual void serialize(Buffer buffer) = 0; 
0

在编译的时候,你只能做的是通过使功能的纯虚函数的类,并非最终的:

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

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

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

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

0

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

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

+0

我想他的意思是,如果C没有声明一个,那么B就会被调用。无论如何,这使得他的发言很有意义。 – jthill 2013-03-01 22:44:22

0

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

迟早有些时候,你必须让事情掌握在程序员手中。

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