C++ の shared_ptr で動的バインディング2020年05月09日 11時19分27秒

C++ の shared_ptr はポインタ型を保持して、管理するため。ポインタ型なので、仮想関数による動的バインディングは有効。
#include <memory>
#include <iostream>

class base
{
public:
    virtual void f() const
    {   
        std::cout << "base" << std::endl;
    }
};

class derived : public base
{
public:
    void f() const
    {   
        std::cout << "derived" << std::endl;
    }
};

int main()
{
    std::shared_ptr< base > ptr = std::make_shared< derived >();

    ptr->f();
}
これを実行すると、derived になる。
% c++ shared_ptr_inheritance.cpp
% ./a.out 
derived

継承関係にない shared_ptr 型を渡すとエラーになるようだ。

#include <memory>

int main()
{   
    std::shared_ptr< char > incompatible = std::make_shared< int >()
;
}
実際のエラーの例。
% c++ shared_ptr_incompatible.cpp
shared_ptr_incompatible.cpp:5:29: error: no viable conversion from
      'shared_ptr' to 'shared_ptr'
    std::shared_ptr< char > incompatible = std::make_shared< int >();
                            ^              ~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/v1/memory:3703:23: note: candidate constructor not viable: no
      known conversion from 'typename enable_if::value,
      shared_ptr >::type' (aka 'std::__1::shared_ptr') to
      'std::nullptr_t' (aka 'nullptr_t') for 1st argument
    _LIBCPP_CONSTEXPR shared_ptr(nullptr_t) _NOEXCEPT;
                      ^
/usr/include/c++/v1/memory:3717:5: note: candidate constructor not viable: no
      known conversion from 'typename enable_if::value,
      shared_ptr >::type' (aka 'std::__1::shared_ptr') to 'const
      std::__1::shared_ptr &' for 1st argument
...

前回