0

C++ でのメソッドのオーバーライドに問題があります

まず、すべてがうまくいきました。次に、コードをより「整理」し、GitHub で共有するためにいくつかの変更を加えました。

オブジェクト指向の変更をいくつか行った後、理解しやすくするためにコードが機能しなくなりました。これは非常に奇妙なことが原因でした。

ViewGroupは、 を拡張したクラスでViewあり、メソッド HitTest オーバーライド from を持っていますView

したがって、基本的には、hitTest を呼び出す場合、ViewGroup (ViewGroup の場合) または View で実行している必要があります。

わかりました。メソッドにを配置virtualし、ViewGroup で直接実行すると、実際には ViewGroup から hitTest が実行されます。

しかし、新しいポインターを作成して実行しようとすると、ViewGroup で hitTest が実行されなくなり、View で実行されます。理解を容易にするために:

ViewGroup *v = new ViewGroup();

View *t = v;

v->hitTest(100,100); // Runs on ViewGroup (OK)
t->hitTest(100,100); // Runs on View (NOT OK)

アップデート:

ViewGroup.h: https://www.dropbox.com/s/a3lqbm73qlxds3i/ViewGroup.h

ViewGroup.cpp: https://www.dropbox.com/s/vxbqsh6ol430x4p/ViewGroup.cpp

View.h: https://www.dropbox.com/s/tcrb75dmx3v6pgq/View.h

View.cpp: https://www.dropbox.com/s/4sb82d6thqz34od/View.cpp

更新 2:

この問題は、メソッドの宣言の愚かな間違いによって引き起こされました。1 つは として宣言され、もう 1 つは として宣言されましhitTest(int x, int y)hitTest(long x, long y)

コードの「クリーニング」と改善中に発生しました。

しかし、オブジェクトをコピーする前は機能していましたが、コピーした後は機能しなくなったため、非常に奇妙です...

4

1 に答える 1

5

hitTest の 2 引数バージョンのシグネチャは異なります。C++11 にコーディングしている場合は、仮想関数のすべてのオーバーライドに override キーワードを使用してください。これにより、この種の悲しみを免れることができます。

于 2013-05-19T06:49:43.463 に答える