C ++ 11 наследующие конструкторы и модификаторы доступа

Предполагая следующий макет:

class Base
{
protected:
Base(P1 p1, P2 p2, P3 p3);

public:
virtual void SomeMethod() = 0;
}

class Derived : public Base
{
public:
using Base::Base;

public:
virtual void SomeMethod() override;
};

Должен ли я быть в состоянии указать DerivedПубличный конструктор здесь? VC ++ выдает следующую ошибку:

не может получить доступ к защищенному члену, объявленному в классе ‘Derived’
компилятор сгенерировал здесь Derived :: Derived [указывает на использование Base :: Base
линия] см. объявление «Производные»

то есть он игнорирует модификатор доступа над унаследованным конструктором.

Это ограничение функции? Это не имеет никакого смысла для Base класс, чтобы иметь открытый конструктор, так как он никогда не может быть создан непосредственно (из-за чисто виртуального метода).

33

Решение

Согласно 12.9 / 4, «Наследование конструкторов», когда говорят using X::X,

Объявленный конструктор имеет тот же доступ, что и соответствующий конструктор в X.

Таким образом, унаследованный конструктор также protected,

26

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]