如何将基础 class shared_ptr 对象分配给子 class shared_ptr 对象

How to assign base class shared_ptr object to child class shared_ptr object

在下面的场景中,我需要从 Base class A 共享指针调用子 class B 函数 (fun1) 由设置函数返回,并且同样使用了 dynamic_cast_pointer 以便派生 class shared_ptr 对象可以分配给 Base class shared_ptr 但是在编译期间我是 不允许这样做。谁能建议如何实现这种行为

#include <iostream>
#include <memory>
using namespace std;

class A
{
  public: 
    void fun() {cout<<"A"<<endl;}    
};

class B : public A
{
   public:
   void fun1() {cout<<"B" <<endl;}
    
};

shared_ptr<A> setup(shared_ptr<A> ptr = nullptr )

{
    if(!ptr)
    {
        
        ptr = make_shared<A> ();
    }
    
    ptr.get()->fun();
    
    return ptr;
    
}

int main() {            
    auto ptr = std::dynamic_pointer_cast <B> (setup());
    ptr->fun1();   // Doesn't compile             
    }

我认为这个问题是从真正的问题中删减的。

假设您不希望此示例在运行时工作(当它是 A 的实例时,您将指向 A 的指针转换为指向 B 的指针 - 所以您处于未定义的行为区域),问题是你没有虚拟方法。编译器告诉你:

 error: 'A' is not polymorphic

当你打算使用指向基址的指针时class,你需要有虚拟析构函数(我个人总是理所当然地使用它们)。

查看演示:https://godbolt.org/z/qe6jPrhsa

在这里您可以看到一个修改后的示例,表明您处于未定义行为领域... https://godbolt.org/z/harzoP946