我正在为程序创建一个类列表。但是,基类有多个孩子,有些孩子也有孩子。我是否需要以任何方式更改我的列表以容纳继承的类?谢谢你的帮助!
太好了,谢谢你的帮助!这是一个非常基本的问题,但是在创建孙子类时,这是否是正确的格式化?
C类:公共B:公共A {
或只是
C类:公共B {?
答案 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
的实例放在第一个列表中,因为B
是A
(由于继承)。但是,当您尝试从第一个列表中的项目访问数据和方法时,您无法访问B
项目认为属于类A
的数据,即使它们不是。{/ p >
对于第二个列表,它可以工作,因为使用了指针和方法的虚拟重载。
我希望这对你的问题有所帮助。
答案 1 :(得分:1)
您可能没有创建类列表,而是创建类的实例。有一个很大的不同。虽然“类”只是数据成员和函数的定义,但实例实际上用生命填充了这个定义。
除此之外,您不能将继承类的实例放入具有父类作为存储类型的列表中。这仅适用于存储指向列表中实例的指针或引用,并将实例本身分配到其他位置。
答案 2 :(得分:0)
STL容器和继承问题是STL容器存储对象的副本,因此子类的所有扩展属性都在丢失。解决方案是单独保留对象,不要复制它们。
在STL容器中,您可以将[智能]指针存储到基类,因此只会复制指针。或者您可以使用Boost::Intrusive或queue.h
等侵入式列表答案 3 :(得分:0)
它只是:
class C: public B {
当然:
class B : public A {
C是B的子类,它是A的子类。
如果你想要一个A,B和C混合实例的列表,你必须声明它:
list<A*> myClassList;