先頭へ戻る

RTTI 解答ページ | Programming Place Plus C++編【言語解説】 第31章

Programming Place Plus トップページC++編

先頭へ戻る

C++編で扱っている C++ は 2003年に登場した C++03 という、とても古いバージョンのものです。C++ はその後、C++11 -> C++14 -> C++17 -> C++20 と更新されており、今後も 3年ごとに更新されます。
なかでも 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;
    Base* p1 = &b;
    Base* p2 = &d;

    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」型であるという結果が得られます。


参考リンク

更新履歴

’2018/4/5 VisualStudio 2013 の対応終了。

’2018/4/2 「VisualC++」という表現を「VisualStudio」に統一。

’2018/1/5 Xcode 8.3.3 を clang 5.0.0 に置き換え。

’2017/7/30 clang 3.7 (Xcode 7.3) を、Xcode 8.3.3 に置き換え。

’2016/10/15 clang の対応バージョンを 3.7 に更新。

’2016/5/29 新規作成。



第31章のメインページへ

C++編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー