防止覆盖和/或隐藏基类功能(C ++ 11)

时间:2013-07-14 17:19:56

标签: c++ inheritance c++11

我想要防止甚至隐藏基类非虚函数一段时间以来我学习了C ++,而且我不确定这是否符合道德规范,但C ++ 11的功能给了我一个想法。假设我有以下内容:

... bases.h

#ifndef baseexample_h
#define baseexample_h

#include <iostream>

class Base{
    public:  
    void foo() {
        std::cout << "Base.foo()\n" << std::endl;
    }
};

class Derived: public Base{ 
    public:
    void foo(){
        std::cout << "Derived.foo()\n" << std::endl;
    }   
};

#endif

和main.cpp ......

#include "bases.h"
#include <iostream>

int main()
{

    Base base;
    Derived derived; 

    base.foo();
    derived.foo();

    std::cin.get();

    return 0;
};

当然输出

Base.foo()

Derived.foo()

由于派生的foo()函数隐藏基本foo函数。我想防止可能的隐藏,所以我的想法是将头文件基本定义更改为:

//.....
class Base{
    public:  
    virtual void foo() final {
        std::cout << "Base.foo()\n" << std::endl;
    }
};

class Derived: public Base{ 
    public:
    void foo(){ //compile error
        std::cout << "Derived.foo()\n" << std::endl;
    }   
};
//......

这似乎强制执行我想要的编译器错误,防止在c ++中覆盖AND / OR隐藏,但我的问题是,这是一个好习惯因为foo()从来不是虚拟的功能开始?这有什么不利因为我有点滥用虚拟关键字吗?感谢。

1 个答案:

答案 0 :(得分:4)

我说,是的,这是不好的做法。当你不想要它时,你引入了多态性,只是为了防止名称隐藏。

但名字隐藏真是太糟糕了?显然,无论出于何种原因,Derived的设计都希望在其基类中隐藏函数foo;这就是它的作用 - 或许它自己调用Base::foo然后执行Derived中所需的一些额外活动。

试图颠覆这种情况已经够糟糕了;尝试通过选择您不想要的语言功能来实现这一目标更糟糕。

如果您确实需要来调用基本函数,请使用derived.Base::foo(),但请注意,您实际上正在破坏类Derived的API,您应该使用它按照记录使用。