У меня есть базовый класс, который я хочу, чтобы выглядеть следующим образом:Как я могу получить полиморфное поведение в конструкторе C++?
class B
{
// should look like: int I() { return someConst; }
virtual int I() = 0;
public B() { something(I()); }
}
Суть в том, чтобы заставить вытекающие классы переопределить I
и заставить его назвать, когда каждый объект строится. Это привыкает делать некоторые бухгалтерские операции, и мне нужно знать, какой тип объекта строится (но я иначе рассматриваю текущий объект как базовый класс).
Это не работает, потому что C++ не позволит вам вызывать абстрактную виртуальную функцию из конструктора.
Есть ли способ получить тот же эффект?
на основе this link, казалось бы, что ответ не существует никакого способа, чтобы получить то, что я хочу. Однако то, что он говорит:
Короткий ответ: нет. Базовый класс ничего не знает о том, из какого класса он связан, и это тоже хорошо.
[...]
То есть, объект официально не становится экземпляром Derived1 до тех пор, пока не начнется конструктор Derived1 :: Derived1.
Однако в моем случае я не хочу знать, что это является но то, что он будет стать. На самом деле, мне даже не важно, что я верну, если только пользователь может (после факта) перевести его в класс. Поэтому я мог бы использовать что-то вроде указателя возврата и избегать его.
(теперь обратно к чтению этой ссылке)
Читайте это: http://stackoverflow.com/questions/1425695/1426834. Возможно, вы сможете использовать PIMPL. –