2010-10-20 2 views
3

Я, к примеру, такой класс:Вызов базового метода из производного класса

class Base 
{ 
    public: void SomeFunc() { std::cout << "la-la-la\n"; } 
}; 

Я получаю новый от него:

class Child : public Base 
{ 
    void SomeFunc() 
    { 
     // Call somehow code from base class 
     std::cout << "Hello from child\n"; 
    } 
}; 

И я хочу видеть:

la-la-la 
Hello from child 

Могу ли я вызвать метод из производного класса?

ответ

10

Sure:

void SomeFunc() 
{ 
    Base::SomeFunc(); 
    std::cout << "Hello from child\n"; 
} 

Btw так Base::SomeFunc() не объявлен virtual, Derived::SomeFunc()скрывает его в базовом классе вместо переопределяет его, который, безусловно, будет вызывать некоторые неприятные сюрпризы в долгосрочной перспективе , Таким образом, вы можете захотеть изменить декларацию

public: virtual void SomeFunc() { ... } 

Это автоматически делает Derived::SomeFunc()virtual, а также, хотя вы можете предпочесть явно объявляя это так, в целях ясности.

+0

+1 за предупреждение о скрытии –

+0

Спасибо за ответ. – Ockonal

4
class Child : public Base 
{ 
    void SomeFunc() 
    { 
     // Call somehow code from base class 
     Base::SomeFunc(); 
     std::cout << "Hello from child\n"; 
    } 
}; 

Кстати вы можете захотеть сделать Derived::SomeFuncpublic тоже.

+0

Возможно, вы также захотите, чтобы обе функции «SomeFunc» были виртуальными, поэтому вы можете вызвать метод в базовом классе и вызвать его в производном классе. – Colen

+0

Вы забыли удалить комментарий :) – codymanix

+0

@codymanix - перевела его сейчас, спасибо –

0
class Child : public Base 
{ 
    void SomeFunc() 
    { 
     Base::SomeFunc(); 
     std::cout << "Hello from child\n"; 
    } 
}; 
0

Да, вы можете. Обратите внимание, что вы дали методам одно и то же имя, не квалифицируя их как virtual, и компилятор тоже должен его заметить.

class Child : public Base 
{ 
    void SomeFunc() 
    { 
     Base::SomeFunc(); 
     std::cout << "Hello from child\n"; 
    } 
}; 
1

Вы делаете это, вызывая функцию снова с префиксом имени класса родителей. Вы должны префикс имени класса, потому что возможно несколько родителей, которые предоставляют функцию с именем SomeFunc. Если бы была свободная функция с именем SomeFunc, и вы хотели ее назвать, то :: SomeFunc выполнил бы эту работу.

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