我有兩個不同的類(第一,第二),它繼承了相同的基類(Base)。我想在同一個向量中存儲First和Second的實例,而不將它們的類拼接到Base類。如果我使用向量,會發生這種拼接,就像下面:在同一個向量中存儲兩個不同的類(具有相同的繼承基類)? (沒有提升)
#include <iostream>
#include <vector>
class Base {
public:
Base() { }
virtual void test() { std::cout << "I am just the base class\n"; }
};
class First : public Base {
public:
First() { }
void test() { std::cout << "This is the First class\n"; }
};
class Second : public Base {
public:
Second() { }
void test() { std::cout << "This is the Second class\n"; }
};
int main() {
First *f = new First();
Second *s = new Second();
// First, I keep a vector of pointers to their base class
std::vector<Base> objs;
objs.push_back(*f);
objs.push_back(*s);
objs[0].test(); // outputs "I am just the base class"
objs[1].test(); // outputs "I am just the base class"
}
最終,當兩個物體放入到載體,它們拼接。有沒有辦法(沒有提升)複製這兩個對象到同一個向量?一個向量不是我正在尋找的,我想複製這些對象。
這裏有很多很好的答案。不幸的是,我不能假定C++ 11,所以我最終利用克隆構造函數提示存儲指針。但最終,克隆允許我首先創建副本。
這是我最後的解決辦法:
#include <iostream>
#include <vector>
class Base {
public:
Base() { }
virtual void test() { std::cout << "I am just the base class\n"; }
virtual Base* clone() const = 0;
};
class First : public Base {
public:
First() { }
void test() { std::cout << "This is the First class\n"; }
First* clone() const { return new First(*this); }
};
class Second : public Base {
public:
Second() { }
void test() { std::cout << "This is the Second class\n"; }
Second* clone() const { return new Second(*this); }
};
int main() {
First *f = new First();
Second *s = new Second();
std::vector<Base *> bak;
bak.push_back(f->clone());
bak[0]->test();
}
我認爲你的意思是'切片'。 「拼接」恰恰相反。 – 2011-12-21 07:35:17
只要確保在使用沒有智能指針的克隆()時,刪除您克隆的所有內容 – stefaanv 2011-12-21 15:24:33