1

考虑以下:

// ConsoleApplication1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string>
#include <iostream>

using namespace std;

class Foo {
public:
    // NVI
    bool method() {
        cout << "Foo::method" << endl;
        return method_impl();
    }

    // Why not do this instead?
    //virtual bool method() final {
    //    cout << "Foo::method" << endl;
    //    return method_impl();
    //}

private:
    virtual bool method_impl() = 0;
};

class Bar : public Foo {
public:
    // What stops someone from doing this hiding the Foo::method identifier?
    // Uncomment the below and see how the console output is instead Bar::method and then method_impl

    //bool method() {
    //    cout << "Bar::method" << endl;
    //    return method_impl();
    //}

private:
    virtual bool method_impl() override {
        return true;
    }
};


int _tmain(int argc, _TCHAR* argv[]) {
    Bar bar = Bar();

    cout << bar.method() << endl;

    return 0;
}

正如您在上面看到的,Foo 类试图通过 Foo::method() 成员函数遵循 NVI 模式。

是什么阻止了子类(在本例中为 Bar)使用 Bar::method() 隐藏 Foo::method()?我试过了,我猜什么都没有。如果您取消注释 Bar::method(),控制台应用程序确实会执行 method() 的 Bar 实现,这完全有意义。

这就引出了一个问题,为什么不使用 virtual final 来禁止在子类中隐藏该方法的名称?Foo 类中提供的示例。

谢谢

4

0 回答 0