#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
class Helper
{
public:
Helper() { init(); }
virtual void print() {
int nSize = m_vItems.size();
std::cout << "Size : " << nSize << std::endl;
std::cout << "Items: " << std::endl;
for(int i=0; i<nSize; i++) {
std::cout << m_vItems[i] << std::endl;
}
}
protected:
virtual void init() { m_vItems.push_back("A"); }
std::vector<std::string> m_vItems;
};
class ItemsHelper : public Helper
{
public:
ItemsHelper() { }
protected:
virtual void init() {
Helper::init();
m_vItems.push_back("B");
}
};
int _tmain(int argc, _TCHAR* argv[]) {
ItemsHelper h;
h.print();
}
Этот вывод о том, что размер вектора 1. Я ожидал, что размер будет 2, потому что в функции ItemsHelper :: инициализации я назвал функцию базового класса Helper::init()
, затем добавить второй элемент в вектор. Проблема в том, что ItemHelper :: init не получает вызов, вместо этого вызывается функция init базового класса.функция вопрос виртуального
Я хочу, чтобы функция ItemsHelper :: init вызывалась, и я могу это сделать, вызывая функцию init в ItemsHelper ctor, а не в базовом классе. НО, вопрос, есть ли лучший способ достичь этого и по-прежнему поддерживать вызов init() в базовом классе? Потому что, если я хочу создать объект Helper вместо ItemHelper, тогда функция init никогда не будет вызвана.
btw, это упрощенная версия проблемы, которую я вижу в гораздо большем объекте, я просто сделал эти объекты, например.
Yeap, я согласен, что это лучшее решение !! Держите это просто, мне это нравится! Спасибо! – cchampion
Я думаю, что запись в C++ FAQ, которую вы искали, это: http://www.parashift.com/c++-faq-lite/strange-inheritance.html # faq-23.5 – jamesdlin