如何防止方法在派生类中被覆盖?

时间:2010-12-16 21:48:27

标签: c++ inheritance override

如何强制派生类不会覆盖基类方法?

6 个答案:

答案 0 :(得分:24)

如果能够使用C ++ 11中的final说明符,则可以阻止派生类覆盖该方法。 (Microsoft编译器似乎支持具有类似语义的类似sealed。)

以下是一个例子:

#include <iostream>

struct base {
    // To derived class' developers: Thou shalt not override this method
    virtual void work() final {
        pre_work();
        do_work();
        post_work();
    }
    virtual void pre_work() {};
    virtual void do_work() = 0;
    virtual void post_work() {};
};

struct derived : public base {
    // this should trigger an error:
    void work() {
        std::cout << "doing derived work\n";
    }
    void do_work() {
        std::cout << "doing something really very important\n";
    }
};

int main() {
    derived d;
    d.work();
    base& b = d;
    b.work();
}

这是我尝试编译时得到的结果:

$ g++ test.cc -std=c++11
test.cc:17:14: error: virtual function ‘virtual void derived::work()’
test.cc:5:22: error: overriding final function ‘virtual void base::work()’

答案 1 :(得分:16)

如果使方法为非虚拟,则派生类不能覆盖该方法。但是,类不能覆盖基类中的方法,并且阻止进一步派生类不能覆盖相同的方法。一旦该方法是虚拟的,它就会保持虚拟。

答案 2 :(得分:2)

不要虚拟。

这不会阻止从您的类派生并隐藏该函数(通过提供具有相同名称的另一个成员函数)。但是,如果你的类无论如何都不是派生的(没有虚拟析构函数,没有虚拟成员函数),那应该不是问题。

答案 3 :(得分:1)

如果你想保持公开,不要将其声明为虚拟。

编辑:Srikanth评论了在派生类中覆盖私有成员函数的想法。

class A
{
public:
    virtual ~A(){};
    void test()
    {
        foo();
    };
private:
    virtual void foo()
    {
        std::cout << "A";   
    };
};


class B : public A
{
public:
    virtual void foo()
    {
        std::cout << "B";   
    };
};


void test()
{
    B b;
    A& a = b;

    a.test(); // this calls the derived B::foo()

    return 0;
}`

答案 4 :(得分:0)

据我所知,你不能在c ++上做到这一点,你可以尝试将其声明为私有。 。在此链接http://en.allexperts.com/q/C-1040/prevent-overriding-functions-derived.htm

上查找更多信息

答案 5 :(得分:-1)

简短的回答:没有必要。答案很长,你可以做some twists,但值得吗?