2013-03-01 155 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)或一些這樣的?