链接列表与c ++中的继承类?

时间:2011-11-08 06:07:15

标签: c++ class list inheritance

我正在为程序创建一个类列表。但是,基类有多个孩子,有些孩子也有孩子。我是否需要以任何方式更改我的列表以容纳继承的类?谢谢你的帮助!

太好了,谢谢你的帮助!这是一个非常基本的问题,但是在创建孙子类时,这是否是正确的格式化?

C类:公共B:公共A {

或只是

C类:公共B {?

4 个答案:

答案 0 :(得分:3)

采取以下计划:

#include <iostream>
#include <list>

struct A
{
    virtual void hello()
       { std::cout << "Hello from A\n"; }
};

struct B : public A
{
    virtual void hello()
       { std::cout << "Hello from B\n"; }
};

int main()
{
    std::list<A>  l1;
    std::list<A*> l2;
    A a;
    B b;

    l1.push_back(a);
    l1.push_back(b);

    l2.push_back(&a);
    l2.push_back(&b);

    l1.front().hello();
    l1.back().hello();

    l2.front()->hello();
    l2.back()->hello();
}

我们声明了两个列表,一个使用类A的实例,另一个使用指向A的指针。您可以将B的实例放在第一个列表中,因为BA(由于继承)。但是,当您尝试从第一个列表中的项目访问数据和方法时,您无法访问B项目认为属于类A的数据,即使它们不是。{/ p >

对于第二个列表,它可以工作,因为使用了指针和方法的虚拟重载。

我希望这对你的问题有所帮助。

答案 1 :(得分:1)

您可能没有创建类列表,而是创建类的实例。有一个很大的不同。虽然“类”只是数据成员和函数的定义,但实例实际上用生命填充了这个定义。

除此之外,您不能将继承类的实例放入具有父类作为存储类型的列表中。这仅适用于存储指向列表中实例的指针或引用,并将实例本身分配到其他位置。

答案 2 :(得分:0)

STL容器和继承问题是STL容器存储对象的副本,因此子类的所有扩展属性都在丢失。解决方案是单独保留对象,不要复制它们。

在STL容器中,您可以将[智能]指针存储到基类,因此只会复制指针。或者您可以使用Boost::Intrusivequeue.h

等侵入式列表

答案 3 :(得分:0)

它只是:

class C: public B {

当然:

class B : public A {

C是B的子类,它是A的子类。

如果你想要一个A,B和C混合实例的列表,你必须声明它:

list<A*> myClassList;