今天,我發現了以下令人不安的曖昧情況在我們的代碼庫:我如何知道哪個函數會被調用?
class Base {
public:
virtual void Irrelevant_Function(void) = 0;
protected:
C_Container * Get_Container(void);
};
class A : public Base, public Not_Important {
public:
inline C_Container * Get_Container(void);
};
class B : public Base, protected SomethingElse {
public:
C_Container * Get_Container(void);
};
很多事情都調用Get_Container方法,但並不總是調用正確的 - 注意,所有這些功能都是虛擬的。
我需要重新命名方法Get_Base_Container
,Get_A_Container
等以消除歧義。 C++使用什麼規則來確定它應該調用哪個版本的函數?我想從本來應該被調用的「已知狀態」開始,然後找出那裏的錯誤。
例如,如果我有一個指向Base的指針並調用Get_Container,我認爲它只會調用該函數的基本版本。如果我有指向A的指針呢?那麼指向B的指針呢?那堆上的A或B怎麼樣?
謝謝。
如果您已經在基類中使用`= 0;`來編寫它,它將不會編譯。 `= 0`只能用於純虛擬方法。 – wheaties 2011-01-27 23:16:48