我有一個帶有向量的類,如下所示:
#include <vector>
class Base{};
class Derived: public Base{};
class Foo{
private:
std::vector<Base*> vec;
public:
Foo() = default;
void addObject(const Base* b){
// vec.push_back(new Base(*b));
// vec.push_back(new Derived(*b));
}
};
int main(){
Derived* d = new Derived();
Base* b = new Base();
Foo f;
f.addObject(d);
f.addObject(b);
delete d;
delete b;
return 0;
}
函式addBase可以接收Derived 的指標。該行vec.push_back(new Base(b)); 預計使用 b 的副本來初始化一個新物件,其指標將被push_back。如果我不使用 new,我將在 b 和向量之間共享資源(這是一種罪過)。
我想保持多型性。我如何確保被推回的物件保持它們在創建程序中分配的型別,而不會將所有內容強制轉換為 Base 物件。
uj5u.com熱心網友回復:
如果要創建傳遞給 的物件的克隆,則addObject基本上有兩種選擇。1)clone在Baseand 中有一個虛函式Derived,或者更好 2) 讓復制建構式處理它。
如果您選擇第二個選項,則addObject需要知道傳遞物件的實際型別。這可以通過模板來完成:
template <class T>
void addObject(const T * t)
{
Base *b = new T(*t);
}
在健壯的程式中,我們不想使用new/delete而是使用std::unique_ptr或std::shared_ptr。t作為參考傳遞,而不是指標,也被認為是更好的做法。
#include <vector>
#include <memory>
#include <iostream>
class Base
{
public:
virtual void cname() { std::cout << "Base" << std::endl;}
};
class Derived: public Base
{
public:
virtual void cname() { std::cout << "Derived" << std::endl;}
};
class Foo
{
private:
// You may switch to `std::shared_ptr` if that better fits your use case
std::vector<std::unique_ptr<Base> > vec;
public:
template <class T>
void addObject(const T & t)
{
vec.push_back(std::make_unique<T> (t));
}
void dump()
{
for (auto &bp: vec)
bp->cname();
}
};
int main(){
Derived d;
Base b;
Foo f;
f.addObject(d);
f.addObject(b);
f.dump();
return 0;
}
自然要使其作業,傳遞給的參考addObject必須是正確的型別。這將創建一個 type 的克隆Base,而不是Derived:
Derived d;
Base &e = d;
f.addObject(e);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/349714.html
上一篇:C :為什么這不會導致懸空指標?
