从派生类重写Base类的const方法

时间:2012-03-25 18:49:55

标签: c++ class overloading override

class Base{
//...
    public:
    int get()const{ // const
    // Do something.
     }
    int get(int x){
    // Do Someting.
     }

    //...

};
class Derived:public Base{
//....
     public:
     int get(){ // not const (not the same signature as the one is the base class) 
     //Dosomething
     }
      //...

};

我知道Derived类中的get()将隐藏Base类中的get()和get(int x)方法。所以我的问题是:
1)这是否意外超载或覆盖? 2)确实在派生类中使get()const会改变一些东西(隐藏或不隐藏Base类方法)。

引用c ++书:

“当你想要覆盖它时,隐藏基类方法是一个常见的错误 忘记包含关键字const。 const是签名的一部分,并将其关闭 更改签名,因此隐藏方法而不是覆盖它。 “

3 个答案:

答案 0 :(得分:7)

既不是超载也不是压倒一切。相反,它是隐藏

如果其他功能也可见,重载,您可以使用using来实现:

class Derived  : public Base
{
public:
    using Base::get;
    int get();
};

即使你在派生类中声明了int get() const,它也只是隐藏了基函数,因为基函数不是virtual

答案 1 :(得分:2)

  1. 两者都没有,只是“隐藏”。

  2. 没有。隐藏基于函数名称而不是函数签名。

  3. 只有在您声明了基类功能virtual时,您的引用才有意义;你无法覆盖非virtual函数。

答案 2 :(得分:2)

重载是一个名为相同的函数,但具有不同的签名。

覆盖覆盖已存在的签名。

你刚刚“隐藏”,这两者都没有。

快速谷歌搜索显示: http://users.soe.ucsc.edu/~charlie/book/notes/chap7/sld012.htm您可能会觉得有帮助。