我有一个A类,处理特定类型的对象(A的实例)。我想要一个B类,它主要(即不是它的所有方法都是相同的)相同的行为,但它正在处理不同类别的对象(B那里)。
以下是我的尝试:
#include <iostream>
#include <vector>
class A
{
public:
virtual void perform() { data.push_back(A()); };
std::vector<A> data;
};
class B : protected A
{
public:
B() : A() {}
void test() { perform(); }
std::vector<B> data;
};
int main()
{
B b;
b.test();
std::cout << b.data.size() << std::endl;
}
// output: 0
// I expected: 1
我期望在插入期间使用std::vector<B>
而不是std::vector<A>
,因为B是B的子类。
我错过了什么?有没有办法可以确保A类中定义的每个方法在B类中按预期工作?
谢谢!
答案 0 :(得分:3)
C ++中基于继承的多态只处理函数,而不处理数据元素。也就是说,更改对象的类型只会影响调用哪个函数,而不会影响使用哪个数据元素。
此外,您无法将A
类型的对象分配给B
的容器。忽略多态,你不能这样做:
std::vector<B> data;
data.push_back(A());
那是因为B
继承自A
,而不是相反。
第三,无论如何,赋值必须使用指针,而不是直接对象。所以你必须做类似的事情:
std::vector<A*> data;
data.push_back(new B);
答案 1 :(得分:0)
当您需要针对不同类型的相同行为时,请使用模板:
template <typename Element>
class Container
{
public:
void perform() { data.push_back(Element()); };
std::vector<Element> data;
};
int main(){
Container<A> a;
Container<B> b;
a.perform();
b.perform();
std::cout << a.data.size() << std::endl;
std::cout << b.data.size() << std::endl;
}
免责声明:未经过编译测试