Подтвердить что ты не робот

С++ 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 как открытый здесь? VС++ дает следующую ошибку:

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

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

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

4b9b3361

Ответ 1

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

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

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