covariant の戻り型

C++で出来てC++/CLIで出来ないことをちまちま調査。

ref class B {
public:
  virtual B^ clone() {
    return gcnew B();
  }
};

ref class D : B {
public:
  virtual D^ clone() override {
    return gcnew D();
  }
};

void main() {
  D^ d = gcnew D();
  D^ d1 = d->clone();
}

/* 結果
$ cl /clr:safe derived.cpp
derived.cpp(10) : error C2392: 'D ^D::clone(void)' : covariant の戻り型は
マネージ クラスでサポートされていません。サポートされる場合は、
'B ^B::clone(void)' はオーバーライドされます。
        derived.cpp(3) : 'B::clone' の宣言を確認してください。
 */

C++/CLIだと共変の戻り型(仮想関数の戻り値型を派生クラスで置き換える)をサポートしてくれないんですね。C#も出来ないのでやっぱりって感じですけど。あと、constなメンバ関数が駄目なのも残念です。