今日、私たちのコードベースで次のような不穏な状況が見つかりました。
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 を呼び出す場合、関数の Base バージョンを呼び出すだけだと思います。Aへのポインタがある場合はどうなりますか? Bへのポインタはどうですか?ヒープ上の A または B はどうですか?
ありがとう。