0

可能重复:
如何强制子相同的虚函数首先调用其父虚函数

编辑人们完全忽略了这一点:我要说的是,如果很多类都继承了 Base,我不想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;
}
4

4 回答 4

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.
    }
};
于 2012-05-01T20:11:09.800 回答
3
class A : public Base
{
    void myFunction ()
    {
        Base::myFunction();    // <-------------------------------
        // do some clever stuff without having to set the flags here.
    }
};
于 2012-05-01T20:10:05.947 回答
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.
    }
};
于 2012-05-01T20:17:58.863 回答
0

凭借您的继承结构,派生类中的 myFunction() 调用排除了基类中版本的调用,因此标志永远不会设置为“true”。

于 2012-05-01T20:11:40.847 回答