Насколько я знаю, вы не можете наследовать конструкторы в C ++.Но существуют ситуации, когда может потребоваться, чтобы вы выглядели так, как будто вы можете создавать экземпляры унаследованных классов так же, как вы создаете их базу:
struct Base {
int i;
int const j;
Base(int i, int j) : i(i), j(j) {}
};
// option 1)
struct Derived1 : Base {
Derived1(int i, int j) : Base(i,j) {}
};
Base* baseFactory() {
return new Derived1(42,47);
}
// option 2)
struct Derived2 : Base {
};
Base* baseFactory() {
Base* b = new Derived2();
b->i = 42;
b->j = 47; // broken!
// alternative could be to implement Base::operator=
return b;
}
Обратите внимание, что производные классы могут быть созданы по умолчанию, если они недля их базового класса (классов).
Вариант 1 - это то, что обычно делается, я думаю, но вы печатаете код, не выражая ничего нового.Вариант 2 нарушает const
правильность (и не позволяет использовать ссылки в качестве членов), потому что все должно быть назначаемым.
Есть ли способ обойти это?
Редактировать : C ++ 11 великолепен, но, к сожалению, мне нужно решение C ++ 03.