Добрый день.
Читаю книгу Страуструпа и там на примере работы с графической библиотекой 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.2error: 'B::B(std::initializer_list<int>)' is protected
VC++13IntelliSense: 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.
Объясните, пожалуйста, прав ли я или же я не улавливаю какой-то момент.