92993


### 質問内容

タイトル通りなのですが`std::shared_ptr<>` スマートポインタを用いて基底クラスを派生クラスにダウンキャストする方法が知りたいです。

### 調べたこと

参考サイトより

[code]

    std::shared_ptr<Derived> derived = std::make_shared<Derived>();
    std::shared_ptr<Base> base = std::dynamic_pointer_cast<Base>(derived);
    
[/code]

を参考にDerivedがderでbaseがbaseに置き換わり派生から基底じゃなくて基底から継承になるだけなだけのはずなのですが以下のエラーが出ます。

### エラー

[code]

    $ make
    g++ -c -MMD -MP src/Main.cpp -o obj/Main.o -I./../src -I ~/Library -I ~/Library/freetype 
    In file included from /usr/include/c++/9/memory:81,
                     from src/Main.cpp:2:
    /usr/include/c++/9/bits/shared_ptr.h: In instantiation of ‘std::shared_ptr<_Tp> std::dynamic_pointer_cast(const std::shared_ptr<_Tp>&) [with _Tp = der; _Up = base]’:
    src/Main.cpp:42:62:   required from here
    /usr/include/c++/9/bits/shared_ptr.h:510:23: error: cannot dynamic_cast ‘(& __r)->std::shared_ptr<base>::<anonymous>.std::__shared_ptr<base, __gnu_cxx::_S_atomic>::get()’ (of type ‘using element_type = std::remove_extent<base>::type*’ {aka ‘class base*’}) to type ‘using element_type = using element_type = std::remove_extent<der>::type*’ {aka ‘class der*’} (source type is not polymorphic)
      510 |       if (auto* __p = dynamic_cast<typename _Sp::element_type*>(__r.get()))
          |                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    make: *** [Makefile:15: obj/Main.o] エラー 1
    
    
[/code]

### 調べたこと

` std::shared_ptr<der> b =
std::dynamic_pointer_cast<der>(d);`をコメントアウトするとエラーがなくなるのでこの下の行である最後の行がエラーの原因です。

### 参考サイト

(shared_ptr の dynamic_cast 部): <https://komorinfo.com/blog/cast-of-smart-
pointers/#toc_id_2>

### 知りたいこと

スマートポインタstd::shared_ptr<>を用いて基底から派生にキャストする方法が知りたい

### ソースコード(最下部)

[code]

    #include <iostream>
    #include <memory>
    
    class base
    {
    public:
        base()
        {
            std::cout<<"base() "<<std::endl;
        }
    };
    
    class der : public base
    {
    public:
    
        der() : base()
        {
            std::cout<<"der() "<<std::endl;
        }
    };
    
    
    
    
    int main()
    {
    
        std::shared_ptr<base> d = std::make_shared<der>();
        std::shared_ptr<der> b = std::dynamic_pointer_cast<der>(d);
    
    
        return 0;
    }
    
    
[/code]


CC BY-SA 4.0
2022-12-24T06:58:20.773
92984
2023-03-25T12:24:56.230
2022-12-24T12:45:30.327
55177
55177
question
c++
std::shared_ptr<>型を基底クラスを派生クラスにダウンキャストできない原因が知りたい


エラーメッセージに

> source type is not polymorphic

とあります。  
つまり`base`クラスの派生クラスが多態的に振舞うために、`base`クラスに何らかの`virtual`関数が含まれている必要があります。  
例えば `virtual ~base{}` などです。

なお、`std::shared_ptr`/`std::dynamic_pointer_cast`を使用せずとも、`dynamic_cast`でも同様の事が起きます。


CC BY-SA 4.0
2022-12-24T16:11:15.393
92993
2022-12-24T16:11:15.393
9113
92984
answer