我正在將我的Java程式翻譯成C 。我在嘗試以與Java相同的方式使用多型性時遇到了問題。
我的代碼看起來像這樣:
class Base
{
public:
virtual void print() = 0;
};
class Derived_1 : public Base
{
public:
void print()
{
std::cout << "1" << std::endl;
}
};
class Derived_2 : public Base
{
public:
void print()
{
std::cout << "2" << std::endl;
}
};
接下來是我嘗試過的主要方法的兩個版本,它們都給我編譯器錯誤:
1:
int main(int argc, char const *argv[])
{
std::vector<Base> v;
v.push_back(Derived_1());
v.push_back(Derived_2());
for(Base i: v)
{
i.print();
}
return 0;
}
錯誤:
object of abstract class type "Base" is not allowed:C/C (322)
main.cpp(35, 14): function "Base::print" is a pure virtual function
2:
int main(int argc, char const *argv[])
{
std::vector<Base*> v;
v.push_back(new Derived_1());
v.push_back(new Derived_2());
for(Base* i: v)
{
i.print();
}
return 0;
}
錯誤:
expression must have class type but it has type "Base *"C/C (153)
你們會怎么解決這個問題?
uj5u.com熱心網友回復:
來自(哪里爪哇至C ,有很多需要注意的地方;特別是記憶體管理!
在您展示的第一個案例中,您正在對物件進行切片。請參閱什么是物件切片?
為了訪問虛函式,您應該使用std::vector<Base*>(即指向的向量Base),std::vector<std::unique_ptr<Base>>或std::vector<std::shared_ptr<Base>>(即指向智能指標的向量Base)。
在您顯示的第二個代碼中,您 v是一個指向 的向量Base,這意味著您需要通過->運算子訪問成員。
即您應該訪問print()如下:
i->print();
^^^
或者:
(*i).print();
^^^^^
另請注意:
在第二種情況下,無論您
new編輯什么,都必須是deleted,這樣程式就不會泄漏記憶體。或者,我們有智能記憶體管理Base缺少一個解構式,這virtual將導致在呼叫物件時出現未定義delete的行為。您應該為定義的行為添加一個。請參閱:何時使用虛擬解構式?
使用std::unique_ptr,您的代碼將如下所示(示例代碼):
#include <memory> // std::unique_ptr, std::make_unique
class Base
{
public:
virtual void print() /* const */ = 0;
// add a virtual destructor to the Base
virtual ~Base() = default;
};
class Derived_1 : public Base
{
public:
void print() override /* const */ {
std::cout << "1" << std::endl;
}
};
class Derived_2 : public Base
{
public:
void print() override /* const */ {
std::cout << "2" << std::endl;
}
};
int main()
{
std::vector<std::unique_ptr<Base>> v;
v.reserve(2); // for unwanted re-allocations of memory
v.emplace_back(std::make_unique<Derived_1>());
v.emplace_back(std::make_unique<Derived_2>());
for (const auto& i : v) // auto == std::unique_ptr<Base>
{
i->print();
}
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/484000.html
下一篇:兩個鏈表的交集
