2014-01-09 4 views
28

доступа Если предположить, что следующий макет: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 «s, как публика здесь? VC++ дает следующее сообщение об ошибке:

cannot access protected member declared in class 'Derived'
compiler has generated 'Derived::Derived' here [points to the using Base::Base line]
see declaration of 'Derived'

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

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

ответ

23

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

A constructor so declared has the same access as the corresponding constructor in X.

Так унаследованный конструктор также protected.

+0

[Пример GCC 4.8. Правильно.] (Http://ideone.com/7JpC2J) –

+3

Подождите, что особенного в конструкторах? То же самое относится и к обычным функциям ... – Mehrdad

+1

@TemplateRex: Я знаю, я спрашиваю, почему. – Mehrdad

Смежные вопросы