我正在學習 C 中的多型性,但我不能向下轉換指向指標的指標。我有一個 Base 類和一個擴展 Base 的類 Derived。我想使用一個函式來創建一個派生物件池Base **derivedFactory(size_t size)。我嘗試這樣做,Base** array = new Derived*[size];但編譯器說它無法從 Derived** 轉換為 Base**。所以我嘗試了下一個:
Base **derivedFactory(size_t size)
{
Base* array = new Derived[size];
for (size_t idx = 0; idx < size; idx)
{
Derived derived = Derived();
array[idx] = derived;
}
Base** arrayBase = &array;
return arrayBase;
}
它編譯。但是當我想訪問所有派生物件時,main.cc 會拋出一個Segmentation fault (core dumped). 它執行 hello(cout) 但在結束回圈的第一次迭代之前拋出。
請你幫助我好嗎?
主檔案
#include "main.ih"
int main()
{
Base **bp = derivedFactory(10);
for (size_t idx = 0; idx <= 10; idx)
{
bp[idx]->hello(cout);
cout << "Not printing\n";
}
}
班級基礎:
class Base
{
private:
virtual void vHello(std::ostream &out)
{
out << "Hello from Base\n";
}
public:
void hello(std::ostream &out)
{
vHello(out);
}
};
派生類:
class Derived : public Base
{
std::string d_text;
private:
void vHello(std::ostream &out) override
{
out << d_text << '\n';
}
public:
Derived()
{
d_text = "hello from Derived";
}
virtual ~Derived()
{}
};
謝謝!
uj5u.com熱心網友回復:
顯示的代碼存在多個基本問題。
Base* array = new Derived[size];
這將創建一個Derived物件陣列。C 中的這種陣列由指向陣列中第一個值的指標表示。在這種情況下,這將是 a Derived *,這就是您從new.
在 C 中,將指向派生類的指標向下轉換為指向基類的指標是有效的。
但就是這樣。這就是你所得到的。
這并不意味著指向陣列中第一個派生物件的指標可以向下轉換為指向基類的指標,然后指向基類的指標可用于訪問實際陣列中的每個派生物件。指標在 C 中不是這樣作業的。嘗試訪問除指標指向的第一個物件之外的任何其他物件是未定義的行為。這是所示代碼的第一個基本問題。
Base** arrayBase = &array;
array是在此函式中宣告為本地物件的物件。當此函式回傳時,array會被銷毀,就像此函式中宣告的任何其他變數一樣。它會被摧毀。以后不會了。它將不復存在。它會為峽灣松樹。它將成為一個前物件。
顯示的代碼嘗試獲取此物件的地址并從此函式回傳它。在函式回傳后,這個指標變成了一個指向被銷毀物件的指標,任何試圖訪問它的行為都將是未定義的行為。
正確執行此操作需要完全不同的方法。new這應該通過new用于創建指向基物件的指標陣列來完成,而不是用于創建派生物件的陣列。然后,通過newing 一個單獨的派生物件來單獨初始化每個指標,例如:
Base **array = new Base *[size];
// ...
array[i] = new Derived{};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/384309.html
下一篇:關于在鏈表中使用時取消參考指標
