Можно ли использовать protected конструкторы класса у наследника?

Добрый день.

Читаю книгу Страуструпа и там на примере работы с графической библиотекой FLTK объясняются способы наследования. Дошёл до одного момента, примерный код которого приведен ниже:
class A {
protected:
	A();
	A(initializer_list<int> lst) {
		for (auto a : lst)
			add(a);
	};
	
	void add(int a) {
		vals.push_back(a);
	}
public:	
	~A() {};
	
	void get_vals(void) const {
		for (auto i : vals)
			cout << i << '\n';
	}
private:
	vector<int> vals;
};

struct B : A {
	using A::A;
};

В книге написано, что используя такое наследование можно в своем коде использовать инициализирующий список при создании элемента класса B:
B elem{1, 2, 3, 4};
Но попытки воспроизвести данную ситуацию приводят к вполне ожидаемому результату:
g++-4.9.2
error: 'B::B(std::initializer_list<int>)' is protected

VC++13
IntelliSense: no instance of constructor "B::B" matches the argument list argument types are: (int, int, int, int) ProtectedTest

Вспоминая про типы наследования, я не понимал, как можно использовать protected-члены или методы производного класса вне себя. Обратился к стандарту и там в разделе 12.9/4 написано, что используя конструкцию using X::X модификаторы доступа в производном классе остаются такими же, как и в классе X.
Объясните, пожалуйста, прав ли я или же я не улавливаю какой-то момент.
  • Вопрос задан
  • 3299 просмотров
Решения вопроса 1
vpetrigo
@vpetrigo Автор вопроса
По всей видимости исправить данную ошибку можно лишь явным объявлением необходимого конструктора в наследуемом классе, используя конструктор базового:
struct B : A {
  B(initializer_list<int> lst) : A{lst} {}
};
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы