2016-09-07 8 views
1

Следующий код не компилируется в GCC 4.9.1:Невозможно вызвать виртуальный защищенный метод в производном классе

class A 
{ 
protected: 
    virtual void f() {} 

}; 

class B : public A 
{ 
protected: 
    virtual void f() override { A* a = new A; a->f(); } 
}; 

я получаю следующее:

header.h: In member function 'virtual void B::f()': 
header.h:51:17: error: 'virtual void A::f()' is protected 

Я бы ожидал, что это компиляции.

Почему это не удается? Есть ли лучший способ сделать f() общедоступным?

ответ

1
A* a = new A; a->f(); 

IS проблема здесь: Вы не можете позвонить f() из a, так как это не public, и не доступны для B в функции члена области.


It Works!

+0

Ok. Странно, что я могу поклясться, что раньше видел что-то подобное, и он успешно скомпилировался. – Silicomancer

+0

Возможно, вы уже отметили 'f()' public ... Я добавил пример anyways –

+0

Возможно. Может ли это быть зависеть от компилятора? Я использовал VC++ – Silicomancer

1

Вы не может кросс-вызов защищенных методов между различными экземплярами класса или экземплярами родительского класса только потому, что B наследоваться от этого класса.

В любом случае B уже есть A.
Вы намеревались позвонить A::f();?

class B : public A { 
protected: 
    virtual void f() override { A::f(); /* ... whatever ... */ } 
}; 
+0

Нет, не A :: f(). Это поведение изменилось с новыми стандартами C++? – Silicomancer

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

  • Нет связанных вопросов^_^