C++ c++;?

C++ c++;?,c++,class,list,inheritance,C++,Class,List,Inheritance,我正在为一个程序创建一个类列表。但是,基类有多个子类,有些子类也有子类。我是否需要以任何方式修改列表以适应继承的类?谢谢你的帮助 太好了,谢谢你的帮助!这是一个非常基本的问题,但在创建孙子类时,这是正确的格式吗 C类:公共B类:公共A类{ 或者只是 C类:公共B{?您可能没有创建类的列表,而是创建类的实例。这是一个很大的区别。虽然“类”只是数据成员和函数的定义,但实例实际上让这个定义充满了生命 除此之外,您不能将继承类的实例放入以父类为存储类型的列表中。只有在列表中存储指向实例的指针或引用,并将

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

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

C类:公共B类:公共A类{

或者只是


C类:公共B{?

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


除此之外,您不能将继承类的实例放入以父类为存储类型的列表中。只有在列表中存储指向实例的指针或引用,并将实例本身分配到其他位置时,此操作才有效。

采用以下程序:

#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
{
虚拟void hello()
{std::cout hello();
}
我们声明了两个列表,一个使用类
A
的实例,另一个使用指向
A
的指针。您可以将
B
的实例放在第一个列表中,因为
B
A
(由于继承)。但是,当您尝试从第一个列表中的项访问数据和方法时,您无法从
B
访问数据。这些项认为它们属于
A
类,即使它们不是

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


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

STL容器和继承的问题是,STL容器存储对象的副本,因此子类的所有扩展属性都会在过程中丢失。解决方法是不复制对象,不复制对象

在STL容器中,您可以存储指向基类的[smart]指针,因此只会复制指针。或者您可以使用侵入式列表,如或它只是:

C类:公共B{

当然:

class B : public A {
C是B的一个子类,B是a的一个子类

如果您想要a、B和C实例的混合列表,则必须声明:

list<A*> myClassList;
list myClassList;

您可能需要确保基类有一个虚拟析构函数,否则可能会导致严重的内存泄漏。注意:将
B
的实例推入
std::list
会导致切片。对于那些想知道这是什么的人,请参阅