Возьмем следующую программу:
#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
, даже если они не являются.
Дляхотя второй список работает из-за использования указателей и виртуальной перегрузки метода.
Надеюсь, это немного поможет в вашем вопросе.