在C ++中继承的属性类型更改

时间:2013-03-19 15:34:19

标签: c++ inheritance

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

谢谢!

2 个答案:

答案 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;
}

免责声明:未经过编译测试