如何将基础 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
在下面的场景中,我需要从 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