C++編で扱っている C++ は 2003年に登場した C++03
という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14
-> C++17 -> C++20 -> C++23 と更新されています。
なかでも C++11 での更新は非常に大きなものであり、これから C++
の学習を始めるのなら、C++11
よりも古いバージョンを対象にするべきではありません。特に事情がないなら、新しい
C++ を学んでください。 当サイトでは、C++14 をベースにした新C++編を作成中です。
問題① 仮想関数を含んでいない場合に、typeid が返す結果が動的な型に基づいた結果を返せないことを確認してください。
#include <iostream>
#include <typeinfo>
class Base {
public:
void f(){}
};
class Derived : public Base {};
int main()
{
;
Base b;
Derived d* p1 = &b;
Base* p2 = &d;
Base
std::cout << typeid(b).name() << "\n"
<< typeid(d).name() << "\n"
<< typeid(p1).name() << "\n"
<< typeid(*p1).name() << "\n"
<< typeid(p2).name() << "\n"
<< typeid(*p2).name() << std::endl;
}
実行結果(Visual Studio 2017 (x86)):
class Base
class Derived
class Base *
class Base
class Base *
class Base
実行結果(clang 5.0.0):
4Base
7Derived
P4Base
4Base
P4Base
4Base
最後に出力される結果が、仮想関数の有無によって変わります。*p2 は Base型であり、仮想関数がない状況だと「Base」型であるという結果を得ます。仮想関数があれば、p2 が本来、Derivedクラスオブジェクトを指すポインタであることを認識でき、「Derived」型であるという結果が得られます。
VisualStudio 2013 の対応終了。
「VisualC++」という表現を「VisualStudio」に統一。
Xcode 8.3.3 を clang 5.0.0 に置き換え。
clang 3.7 (Xcode 7.3) を、Xcode 8.3.3 に置き換え。
clang の対応バージョンを 3.7 に更新。
新規作成。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |