【发布时间】:2011-12-24 04:46:31
【问题描述】:
我正在为一个程序创建一个类列表。但是,基类有多个孩子,并且一些孩子也有孩子。我是否需要以任何方式更改我的列表以适应继承的类?感谢您的帮助!
太好了,感谢您的帮助!这是一个非常基本的问题,但是在创建孙子类时,这是正确的格式吗?
C 类:公共 B:公共 A {
或者只是
C 类:公共 B { ?
【问题讨论】:
标签: c++ class list inheritance
我正在为一个程序创建一个类列表。但是,基类有多个孩子,并且一些孩子也有孩子。我是否需要以任何方式更改我的列表以适应继承的类?感谢您的帮助!
太好了,感谢您的帮助!这是一个非常基本的问题,但是在创建孙子类时,这是正确的格式吗?
C 类:公共 B:公共 A {
或者只是
C 类:公共 B { ?
【问题讨论】:
标签: c++ class list inheritance
您可能不是在创建类列表,而是创建类的实例。有一个很大的不同。虽然“类”只是数据成员和函数的定义,但实例实际上使这个定义充满了生命。
除此之外,您不能将继承类的实例放入以父类作为存储类型的列表中。这仅在您将指针或对列表中的实例的引用存储并在其他地方分配实例本身时才有效。
【讨论】:
采取以下程序:
#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 类,即使它们不是。
对于第二个列表,它可以工作,因为使用了指针和方法的虚拟重载。
我希望这对您的问题有所帮助。
【讨论】:
B 的实例推入std::list<A> 会导致切片。
STL 容器和继承的问题是 STL 容器存储对象的副本,因此子类的所有扩展属性在进行中都会丢失。解决方案是让对象单独放置,不要复制它们。
在 STL 容器中,您可以存储 [智能] 指向基类的指针,因此只会复制指针。或者,您可以使用 Boost::Intrusive 或 queue.h 等侵入性列表
【讨论】:
只是:
class C: public B {
当然还有:
class B : public A {
C 是 B 的子类,B 是 A 的子类。
如果您想要 A、B 和 C 的混合实例列表,则必须声明它:
list<A*> myClassList;
【讨论】: