在下面的場景中,我需要從 setup 函式回傳的基類 A 共享指標呼叫子類 B 函式(fun1),并且同樣使用了 dynamic_cast_pointer 以便派生類 shared_ptr 物件可以分配給基類 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
}
uj5u.com熱心網友回復:
我認為這個問題是從真正的問題中洗掉的。
假設您不希望此示例在運行時作業(當它是 A 的實體時,您將指向 A 的指標轉換為指向 B 的指標 - 所以您處于未定義的行為領域),問題是您沒有虛擬方法。編譯器會告訴你:
error: 'A' is not polymorphic
當您打算使用指向基類的指標時,您需要有虛擬解構式(我個人總是理所當然地使用它們)。
見演示:https ://godbolt.org/z/qe6jPrhsa
在這里,您可以看到一個修改后的示例,表明您處于未定義行為領域... https://godbolt.org/z/harzoP946
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/470843.html
上一篇:賦值時C 向量下標超出范圍