tham khảo:C++ vector với thừa kế
#include <vector>
#include <iostream>
class Func {
public:
virtual void call() {
std::cout<< "Func -> call()" << std::endl;
}
};
class Foo : public Func {
public:
void call() {
std::cout<< "Foo -> call()" << std::endl;
}
};
class Bar : public Func {
public:
void call() {
std::cout<< "Bar -> call()" << std::endl;
}
};
int main(int argc, char** argv) {
std::vector<Func> functors;
functors.push_back(Func());
functors.push_back(Foo());
functors.push_back(Bar());
std::vector<Func>::iterator iter;
for (iter = functors.begin(); iter != functors.end(); ++iter)
(*iter).call();
}
Khi chạy mã đó, nó tạo ra đầu ra sau trên máy tính của tôi:
$ ./test
Func -> call()
Func -> call()
Func -> call()
Nên có cách nào để đảm bảo rằng các chức năng ảo đúng được gọi trong trường hợp này? Tôi mới ở C++ nhưng dự đoán tốt nhất của tôi là ở đây:
(*iter).call();
Nó đang được truyền tới đối tượng Func
. Điều này có đúng không?
có thể trùng lặp của [Lưu trữ hai lớp với cùng một lớp cơ sở trong một std :: vector] (http://stackoverflow.com/questions/8777724/store-two-classes-with-the-same-base-class -in-a-stdvector) –
vâng, tuy nhiên tôi không thể tìm thấy bài đăng đó trước khi tôi tạo cái này, xin lỗi tìm kiếm-fu của tôi không được tốt như bạn ạ –
Có đối tượng cắt xảy ra trong trường hợp của bạn, Vì vậy phần bắt nguồn được cắt bỏ. Bạn nên sử dụng con trỏ của lớp dựa trên cho lưu trữ đối tượng dị. – Naveen