鍋あり谷あり

テーマを決めずに適当に書いています。

仮想関数のことをヘッダに書きたくない

今日は C++ の話。先日仕事中にふと思ったこと。

例えば

struct foo{  virtual void hoge() = 0;  };
struct bar : public foo{  virtual void hoge();  };
struct baz : public baz{  virtual void hoge();  };

こんな時。
foo に hoge という仮想関数があるという情報をヘッダに書く必要があるのはよくわかる。そりゃ絶対必要だ。
bar が hoge をオーバーライドしているかどうかは、bar のコンストラクタを呼んでいいかどうかに関わっているので、それはそれで必要かもしれない。
しかし、baz が hoge をオーバーライドしているか否かは、クラス定義に書く必要はないんじゃないか。
返す値の型とかが微妙に違う関数でオーバーライドするときは仕方ないけど、上記のような場合は、クラス定義に書かなくてもいいような気がする。

さらに。
bar についても、コンストラクタを呼んでいいかどうかだけが必要なのであり、hoge が実装されているかどうかはまあまあどうもいい。

だから例えば、constructable とかいう予約語を入れたりして:

struct foo{  virtual void hoge() = 0;  }
constructable struct bar : public foo{};
struct baz : public bar{};

などとすれば、情報は十分なはず。
だと思うんだけど、何か見落としてるのかなぁ。

#写真と本文は関係ありません。