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