0

我有一个 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 类中都按预期工作?

谢谢!

4

2 回答 2

3

C++ 中基于继承的多态性只处理函数,而不处理数据元素。也就是说,更改对象的类型只会影响调用哪个函数,而不影响使用哪个数据元素。

此外,您不能将类型的对象分配给'sA的容器。B忽略多态性,你不能这样做:

std::vector<B> data;
data.push_back(A());

那是因为B继承自A,而不是相反。

第三,无论如何分配都必须使用指针,而不是直接的对象。因此,您必须执行以下操作:

std::vector<A*> data;
data.push_back(new B);
于 2013-03-19T15:55:51.320 回答
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;
}

免责声明:未经编译测试

于 2013-03-19T15:39:41.110 回答