NVI不会阻止名称隐藏;为什么不使用虚拟决赛呢?

时间:2017-10-01 22:21:53

标签: c++ inheritance virtual final non-virtual-interface

请考虑以下事项:

// 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(),那么控制台应用程序确实沿着方法()的Bar实现进行了操作,这完全有道理。

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

由于

0 个答案:

没有答案