Home > 2006-12 / 実装技術 > This Entry [com : 0][Tb : 0]
このような場合、funcが仮想関数だと、上書き(overriding)するたびに、ID番号からresourceへのポインタを変換する必要があり、(この程度であれば大したことはありませんが)それなりに面倒です。class A
{
public:
virtual void func(int id)
{
resource* p_res = get_resource(id);
// p_resを使った何らかの処理
}
// etc.
private:
struct resource { ... };
resource* get_resouce(int id);
resource res_[256];
};
のようにすることで、派生クラスで仮想関数を上書きするのがかなり楽になります。このように、公開された非仮想メンバ関数では利用者にとって便利なように、非公開または限定公開の仮想関数は実装者にとって便利なように引数や返却値の持ち方を決定することができます。class A
{
public:
void func(int id) { do_func(get_resource(id)); }
// etc.
private:
struct resource { ... };
resource* get_resouce(int id);
virtual void do_func(resoource* p_res) { ... }
resource res_[256];
};
このように、GUIにおけるウィンドウの移動とサイズ変更を同時に行う関数では、座標や幅・高さの指定方法を複数用意したいことでしょう。しかし、これらをすべて仮想関数にしてしまうと、派生クラスで上書きするのが大変です。class window
{
public:
void move_resize(int left, int top, int right, int bottom);
void move_resize(const point& left_top, const point& right_bottom);
void move_rezize(const point& left_top, int width, int height);
void move_resize(const rect& region);
// etc.
};
http://cppemb.blog17.fc2.com/tb.php/101-2d28a8be
Comment