Итак, у меня есть этот тип наследования:
Class A { virtual intfB(){} ; virtual intfC(){}; };
Class B : public A { int fB(){}; };
Class C : public A { int fC(){}; };
Тогда у меня есть класс E, который использует список для хранения объектов B и C.
Class E
{
public:
insert(A* obj){ l.push_front(obj);}
print(){ /* uses iterator i to cout the fB() and fC() of the objects in l */ };
private:
list <A*> l;
}
Я устанавливаю различные функции объектов B
и C
как virtual
в A
, а затем использую итератор i для доступа к объектам l из функции print()
. Моя проблема в том, что я не могу найти правильный способ вызова B::fB()
и C::fC()
, потому что итератор может указывать на объект C
или B
, поэтому я должен сделать что-то подобное для каждого объекта, который я не делаю Я думаю, это практично:
cout << (*i) -> fB();
cout << (*i) -> fC();
Так что в основном я вызываю fC
и fB
для каждого объекта независимо от его типа, и вызывается виртуальная функция базового класса, когда это не правильный вызываемый объект.
Это не может быть правильно, правда? Как еще я могу достичь этого?
Следует отметить, что я должен использовать композицию для классов E, C и B?