2014-09-09 2 views
-2
Class Base() { 
protected: 
    void foo(); 
} 
Class Derived : public Base { 
    void bar(); 
} 

void Derived::bar(){ 
    foo(); //this causes an error. 
} 

Я знаю, что, вероятно, я пропустил что-то очевидное, но я крутился кругами в течение часа. Как вызвать защищенную функцию в производном классе?защищенный вызов функции C++

+0

Какая ошибка возникает? – dlf

+0

Вы пробовали Base :: foo()? –

+0

Обратите внимание, что метод bar() в классе Derived является закрытым, так как это видимость по умолчанию для метода в классе без спецификаторов доступа. –

ответ

5

Ошибка, которая появляется в комментариях ошибка линкера, поэтому вы проверили, что:

Это трудно рассказать больше без дополнительной информации.


Кроме того, ваш код содержит недопустимый синтаксис, который вызывает ошибку (ы):

  • class в нижнем регистре
  • Нет скобки после имени класса
  • ; после определения класса

следующий код работает (до тех пор, пока он не попадает в компоновщик) на g++ version 4.9.0:

class Base { 
protected: 
    void foo(); 
}; 

class Derived : public Base { 
    void bar(); 
}; 

void Derived::bar(){ 
    foo(); 
} 
+0

Это был просто псевдокод – Robomoo

+4

@Robomoo Запрашивать о проблемах с реальным кодом, предоставляя псевдо-код, на самом деле не работает, обычно ... Как вы ожидаете, что псевдокод должен показать проблему? Как вы ожидаете, что ответчики будут отличать псевдо-проблемы от реальной проблемы? – hyde

4

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

#include <iostream> 

class Base { 
protected: 
    void foo() {std::cout << "Hi there" << std::endl;} 
}; 

class Derived : public Base { 
public: 
    void bar(); 
}; 

void Derived::bar(){ 
    foo(); //this causes an error. 
} 

int main (int argc, char** argv){ 
    std::cout << "Hello world" << std::endl; 
    Derived d; 
    d.bar(); 

    return 0; 
} 
Смежные вопросы