Visual C++ 2017において下記のソースコードがビルドでき、実行も可能です。
cpp
1#include <iostream> 2using namespace std; 3 4class Base { 5public: 6 virtual void PureVirtualFunction() = 0 { 7 cout << "Base::PureVirtualFunction" << endl; 8 } 9}; 10 11class Derived : public Base { 12public: 13 virtual void PureVirtualFunction() override { 14 Base::PureVirtualFunction(); 15 cout << "Derived::PureVirtualFunction" << endl; 16 } 17}; 18 19int main() { 20 Derived derived; 21 derived.PureVirtualFunction(); 22 return 0; 23}
出力結果
Base::PureVirtualFunction Derived::PureVirtualFunction
純粋仮想関数であるBase::PureVirtualFunction()
の定義を書く際、=0
に続けて定義を記述しています。
下記の複数のサイトによると、C++の規格書において、この書き方は規格違反となっており、VC++独自の拡張機能?のようです。
こういったVC++独自の拡張機能は他にも色々あると思うのですが、どのようにして確認すれば良いでしょうか?ドキュメント・ヘルプ・ヘッダファイル等、何かしら文章での解説が存在するのでしょうか?
上の例をMicrosoft Docsで調べてみたのですが、抽象クラス (C++) | Microsoft Docsのページを読んでみても、特にそういった記述は見受けられませんでした。
拡張機能かどうかは分かりませんし、あるとした場合の一覧の在り処も分かりませんが、規格のどこまで対応していると言っているのかは以下にまとまっていると思います。
https://docs.microsoft.com/ja-jp/cpp/visual-cpp-language-conformance?view=vs-2017
実際規格どおりに書いたとして、ビルドは通り、意図通りに動くのであれば、現実に困らない範囲でビルドエラー検出がなかったとしても、いいのでは?と個人的には思います。他の例を知りませんし、分かりませんけどね。以上回答にはなっていませんが、情報まで。
回答2件
あなたの回答
tips
プレビュー