我相信我有一个切片问题,我不知道如何解决它。我已将我实际程序中的问题总结为下面的示例。
#include <iostream>
#include <vector>
using namespace std;
class Base {
public:
void Use(void) {
cout << "Using Base :(\n";
}
};
class First_Derived : public Base {
public:
void Use(void) {
cout << "Using First_Derived!\n";
}
};
class Second_Derived : public Base {
public:
void Use(void) {
cout << "Using Second_Derived!\n";
}
};
class A {
public:
vector<Base *> Base_Objects;
};
class B {
public:
vector<Base *> Base_Objects;
};
int main() {
// Create and populate A_Object
A A_Object;
A_Object.Base_Objects.push_back(new First_Derived());
A_Object.Base_Objects.push_back(new Second_Derived());
// Create and populate B_Object with objects in A_Object.Base_Objects
B B_Object;
for (vector<Base *>::iterator i = A_Object.Base_Objects.begin(); i != A_Object.Base_Objects.end(); ++i) {
B_Object.Base_Objects.push_back(*i);
}
// Run the Use() function for the first object in B_Object.Base_Objects
(*B_Object.Base_Objects[0]).Use();
// Get command terminal to pause so output can be seen on Windows
system("pause");
return 0;
}
输出是Using Base :(
但我预期的Using First_Derived!
。我认为问题在于,一旦First_Derived
对象存储在Base_Objects
向量中,它就会失去其独特的Use()
功能,因为它正在转换为Base
类型?有针对这个的解决方法吗?我尝试应用什么是对象切片?但我不相信我正确地应用它们。