Вы должны хранить указатели в deque
, так как полиморфизм работает только с ссылочными и указательными типами. Когда вы вставляете эти объекты в deque
, копии создаются типа A
, «обрезая» части, которые сделали их B
или C
изначально.
Аналогично, A r = B()
просто создает временный B
и копирует A
его часть в A
с именем r
.
Кстати A a = A();
вы могли бы также написать A a;
. Они не полностью эквивалентны, но они выполняют ту же самую работу здесь, и вы, вероятно, имели в виду более простую версию.
A a;
B b;
C c;
a.taco(); //Class A
b.taco(); //Class B
c.taco(); //Class C
// With pointers and containers
deque<A*> aa;
aa.push_back(&a);
aa.push_back(&b);
aa.push_back(&c);
for (int i=0; i<aa.size(); i++)
aa[i]->taco(); // Hurray!
// With refs
B q;
A& r = q;
r.taco(); // Class B!
(Просто помните, что эти объекты a
, b
и c
имеют автоматическую продолжительность хранения. В тот момент, когда они выходят из области видимости, если deque
все еще существует, все его элементы являются недействительными указателями. Я хочу использовать динамическое распределение для дальнейшего управления временем жизни объектов A
, B
и C
... но я оставлю это в качестве упражнения для читателя.)