2012-05-01 2 views
-1

Можно создать дубликат:
How to force child same virtual function call its parent virtual function firstRun функции базового класса, а затем унаследовал класс функций

EDIT Люди полностью отсутствует пункт: То, что я получаю на это, если много классов наследуют База, я не хочу звонить Base::myFunction() для каждого!


Я не совсем уверен, как слово на этот вопрос, но я надеюсь, что это видно из кода (это не может быть скомпилирован, я написал это быстро):

class Base 
{ 
    bool flag = false; 

    void myFunction() 
    { 
     flag = true; 

     // here run the inherited class's myFunction() 
    } 
}; 

class A : public Base 
{ 
    void myFunction() 
    { 
     // do some clever stuff without having to set the flags here. 
    } 
}; 

int main() 
{ 
    A myClass; 
    myClass.myFunction(); // set the flags and then run the clever stuff 
    std::cout << myClass.flag << endl; // should print true 
    return 0; 
} 
+0

Вы имели в виду 'virtual void myFunction'? – Thomas

+0

см. [C++ faq] (http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.5), чтобы объяснить – EdChum

ответ

4

Прежде всего - используйте виртуальные функции для случая, если вы будете использовать указатели. Тогда вам просто нужно вызвать базовый класс myFunction в реализации производного класса. Смотрите пример:

class Base 
{ 
    bool flag = false; 

    virtual void myFunction() 
    { 
     flag = true; 
    } 
}; 

class A : public Base 
{ 
    virtual void myFunction() 
    { 
     Base::myFunction(); // call base class implementation first 
     // do some clever stuff without having to set the flags here. 
    } 
}; 

int main() 
{ 
    A myClass; 

    myClass.myFunction(); // set the flags and then run the clever stuff 

    std::cout << myClass.flag << endl; // should print true 

    return 0; 
} 

Если вы не любите называть вашу функцию базового класса во всех производных классов. Вы можете добавить специальную виртуальную функцию для «умных» вычислений и реализовать ее отдельно во всех производных классах. Пример:

class Base 
{ 
    bool flag = false; 

    virtual void cleverCalc() = 0; 
    virtual void myFunction() 
    { 
     flag = true; 
     cleverCalc(); 
    } 
}; 

class A : public Base 
{ 
    virtual void cleverCalc() 
    { 
     // do some clever stuff without having to set the flags here. 
    } 
}; 
+0

Я уже знал этот метод и хотел его избежать ... но его ближайший ответ, поэтому я его принимаю. – Cheetah

3
class A : public Base 
{ 
    void myFunction() 
    { 
     Base::myFunction(); // <------------------------------- 
     // do some clever stuff without having to set the flags here. 
    } 
}; 
+0

То, что я получал, это если много классов наследуют Base, I не хотите называть 'Base :: myFunction()' для каждого из них! – Cheetah

+0

@Ben Затем сделайте свое действие частью конструктора. Это единственный способ действительно автоматически вызвать что-то из базового класса. – chrisaycock

+0

@chrisaycock - Невозможно сделать то, что я хочу, тогда ... Спасибо. – Cheetah

0

В силу своей структуры наследования, то туРипсЫоп() вызов в производном классе исключает вызов версии в базовом классе, таким образом, флаг никогда не устанавливается на «истинный».

2

Вы делаете еще одну функцию с пустой реализацией (которая будет переопределяться в подклассах), и назовите это в своем myFunction. Что-то вроде этого:

class Base 
{ 
    bool flag = false; 

    void myFunction() 
    { 
     flag = true; 

     // here run the inherited class's myFunction() 
     myDerivedFunction(); 
    } 

    virtual void myDerivedFunction() 
    { 
     // this should be implemented by subclasses. 
    } 
}; 

class A : public Base 
{ 
    void myDerivedFunction() 
    { 
     // do some clever stuff without having to set the flags here. 
    } 
}; 
+0

+1 Чтобы принудительно реализовать подклассы, вы можете сделать 'myDerivedFunction()' чистым виртуальным. – hmjd

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