Есть несколько вещей, которые вы делаете неправильно здесь.Во-первых, вы не инициализируете свою переменную подсчета, поэтому она будет начинаться с использования некоторого случайного значения (оно может быть равно нулю или, может быть, что-то еще).
Далее вам необходимо сохранить указатели для членов вашегосписок, потому что в C++
полиморфизм работает только через указатели .Если список отвечает за удаление своих элементов (обычно), то вам следует использовать умный указатель, такой как std :: unique_ptr :
class Logbook {
public:
int CandidateCount();
// virtual destructor is (usually) important for polymorphic types
virtual ~Logbook() = default;
// store pointers in your list
std::list<std::unique_ptr<class Member>> members;
};
Затем вы можете перебирать этот список, пытаясь динамически приводит каждый указатель к типу, который вы хотите считать.Если он возвращает действительный указатель , то вы знаете, что он относится к этому типу.В противном случае будет возвращено nullptr
:
class Member: public Logbook {};
class Candidate: public Member {};
class Voter: public Member {};
int Logbook::CandidateCount()
{
int membercount = 0; // initialize this!!!!
for(auto& m : members) { // use reference here to avoid making a copy
if(dynamic_cast<Candidate*>(m.get()))
membercount++;
}
return membercount;
}
Примечание: Если вы хотите сделать больше, чем просто считать ваших кандидатов васможет сохранить указатель, полученный из динамического приведения следующим образом:
class Candidate: public Member { public: void do_something(){} };
int Logbook::CandidateCount()
{
int membercount = 0; // initialize this!!!!
for(auto& m : members) { // use reference here to avoid making a copy
if(auto c = dynamic_cast<Candidate*>(m.get())) {
membercount++;
// c is not nullptr and is type Candidate*
c->do_something(); // use your Candidate like this
}
}
return membercount;
}