鍋あり谷あり

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

それはあんまりだよマイクロソフトさん

派生クラスで基底クラスと同名だけど返り値がちょっとだけ違う関数を定義しても、オーバーライドになる。
という話と、多重継承を絡ませると:

struct root{
  virtual root * create(){  return new root;  }
};

struct foo : public virtual root{
  virtual foo * create(){  return new foo;  }
};

struct bar : public virtual root{
  virtual bar * create(){  return new bar;  }
};

struct foobar : public foo, public bar{
  virtual foobar * create(){  return new foobar;  }
};

こんな風になる。
これが。
gcc だとコンパイルできるのに、マイクロソフトコンパイラだとエラーになる。
私の理解が正しければ、コンパイルできるのが正しい。
ちなみにエラーメッセージは

error C2250: 'foobar' : ambiguous inheritance of 'foo::foo::create'
error C2250: 'foobar' : ambiguous inheritance of 'bar::bar::create'

こんなの。あう。

しかし。
C++ って、コンパイラによって動きが色々変わるので仕事には向いてないんじゃないかって気が最近してきた。
rubyperlpythonPHP なら、バージョンさえ合わせておけばどの処理系でも同じように動きそうなもんだ。