2015-06-10 2 views
0
class Base 
{ 
protected: 
    virtual void show() 
    { 
     // Do some stuff. 
    } 
}; 

class Derived : public Base 
{ 
protected: 
    virtual void show() 
    { 
     // Do some stuff. 
    } 
}; 

class Derived_2 : public Derived 
{ 
protected: 
    virtual void show() 
    { 
     this->show(); // error: Base::show() is in accessible 
     show();   // error: Base::show() is in accessible 
     Derived::show(); // error: Base::show() is in accessible 
    } 
}; 

В приведенном выше случае вызов функции виртуального базового класса (переопределен в производных классах) дает ошибку.Почему я не могу вызвать функцию защищенного виртуального базового класса в переопределенной функции производного класса?

+1

Выглядит хорошо для меня (хотя ваш стек переполнится). Каков ваш компилятор? – Bathsheba

+2

Он работает [отлично отлично] (http://ideone.com/GtVImL). – molbdnilo

+0

Вы уверены, что ваше наследство (в вашем фактическом коде) является общедоступным, а не частным? – AndyG

ответ

1

Единственная ошибка, которую я могу найти, заключается в том, что вы вызываете show из своего ведома, ведущего к бесконечной рекурсии и заканчивающегося ошибкой переполнения стека.

Но этот код компилируется и запустить даже без предупреждения:

class Derived_2 : public Derived 
{ 
public: 
    virtual void show() 
    { 
     //this->show(); // infinite recursion => stack overflow 
     Base::show(); // ok calls show() from Base 
     Derived::show(); // ok calls show() from Derived 
     std::cout << "Derived2" << std::endl; 
    } 
}; 

(я объявил, что общественность называть это непосредственно в моем тесте)

0

Если я вас понимаю правильно, и вы хотите позвонить Base::show(), то вы можете сделать это с:

Derived::Base::show(); или просто Base::show();

Но если вы просто хотите, чтобы вызвать метод супер класса, у вас есть правильный код ,

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