当子类调用重写函数时,始终调用父类的虚函数

5

我有这个结构:

class A
{
public:
    virtual void func(int a)
    {
        cout << "System is initiated correctly." << a;
    }
};

class B : public A
{
public:
    virtual void func(int a) override
    {
        A::func(a);
        cout << "This particular system is initiated correctly too" << a;
    }
};

现在,在我从A派生出子类的95%情况下,我都会重写func,并且在这些情况中,我应该在执行其他操作之前调用A::func();。如何避免手动编写这些代码?有时候我甚至会忘记在子类中调用A::func();,导致运行时错误、抛出异常等问题。


你忘记继承了吗?另外,我认为你想要的是不可能的。 - David
是的,Davaid,谢谢。但我知道在C++中没有什么是不可能的 :)。 - Narek
1个回答

16

那么 NVI 模式 呢?

class A
{
public:
    void func(int a)
    {
        cout << "System is initiated correctly." << a;
        do_func(a);
    }

private:
    virtual void do_func(int a) {}
};

class B : public A
{
private:
    virtual void do_func(int a) override
    {
        cout << "This particular system is initiated correctly too" << a;
    }
};

该死,我正要发布完全相同的内容。 - Konrad Rudolph
2
当然,您需要确保您永远不需要一个子类,它不需要调用基本实现。 - Giulio Franco
你比我快得多了。 - Quentin
这解决了特定情况,即您正在尝试“括起来”虚可重写代码(经典NVI)。但是,这并没有直接解决始终调用子类化虚函数的问题,就像构造函数一样。 - Leo Goodstadt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接