Đây là một phần tiếp theo của một related post mà hỏi những câu hỏi vĩnh cửu:Tôi có thể có các thùng chứa đa hình với ngữ nghĩa giá trị trong C++ 11 không?
Tôi có thể có container đa hình với ngữ nghĩa giá trị trong C++?
Câu hỏi đã được hỏi một cách không chính xác. Nó cần phải có được nhiều hơn như:
Tôi có thể đã STL container của một loại cơ sở lưu trữ bởi giá trị, trong đó các yếu tố thể hiện hành vi đa hình?
Nếu bạn đặt câu hỏi về C++, câu trả lời là "không". Tại một số điểm, bạn sẽ cắt các đối tượng được lưu trữ theo giá trị.
Bây giờ tôi hỏi lại câu hỏi, nhưng nghiêm chỉnh về C++ 11. Với những thay đổi đối với ngôn ngữ và các thư viện chuẩn, bây giờ có thể lưu trữ các đối tượng đa hình theo giá trị trong một container STL không?
Tôi biết rõ khả năng lưu trữ con trỏ thông minh vào lớp cơ sở trong vùng chứa - đây không phải là những gì tôi đang tìm kiếm, vì tôi đang cố gắng tạo đối tượng trên ngăn xếp mà không cần sử dụng new
.
Cân nhắc nếu bạn sẽ (từ bài được liên kết) như cơ bản C++ ví dụ:
#include <iostream>
using namespace std;
class Parent
{
public:
Parent() : parent_mem(1) {}
virtual void write() { cout << "Parent: " << parent_mem << endl; }
int parent_mem;
};
class Child : public Parent
{
public:
Child() : child_mem(2) { parent_mem = 2; }
void write() { cout << "Child: " << parent_mem << ", " << child_mem << endl; }
int child_mem;
};
int main(int, char**)
{
// I can have a polymorphic container with pointer semantics
vector<Parent*> pointerVec;
pointerVec.push_back(new Parent());
pointerVec.push_back(new Child());
pointerVec[0]->write();
pointerVec[1]->write();
// Output:
//
// Parent: 1
// Child: 2, 2
// But I can't do it with value semantics
vector<Parent> valueVec;
valueVec.push_back(Parent());
valueVec.push_back(Child()); // gets turned into a Parent object :(
valueVec[0].write();
valueVec[1].write();
// Output:
//
// Parent: 1
// Parent: 2
}
tăng: ptr_vector phải làm những gì bạn muốn. –
Lưu ý rằng bạn có thể mô phỏng ngữ nghĩa giá trị (ít nhất là về các container STL) với một cái gì đó như 'boost :: ptr_container'. –
@Martin: Sao bạn dám đánh bại tôi trong 15 giây?!? –