const和虚拟继承

时间:2016-04-15 21:07:51

标签: c++ inheritance const

struct Base{
    virtual void foo(){
        std::cout << "In Base\n";
    }
};
struct Derived : public virtual Base{
    virtual void foo() const{
        std::cout << "In Derived\n";
    }
};
Base* d = new Derived();

int main(int argc,char** args){
    d->foo();
    system("Pause");
}

当我运行此代码&#34;在Base&#34;打印出来。为什么使用const说明符来改变继承?

2 个答案:

答案 0 :(得分:3)

const更改了功能的签名。所以它是overload而不是override

如果您想确保不犯这些错误,可以使用覆盖。这将检测这些不匹配并产生错误。

这将无法编译:

struct Base{
    virtual void foo(){
        std::cout << "In Base\n";
    }
};
struct Derived : public virtual Base{
    void foo() const override {    // <====  ouch: error because it's a different signature 
        std::cout << "In Derived\n";
    }
};

这将成功编译:

struct Base{
    virtual void foo() const{
        std::cout << "In Base\n";
    }
};
struct Derived : public virtual Base{
    void foo() const override {    // <====  signatures do match
        std::cout << "In Derived\n";
    }
};

答案 1 :(得分:2)

  1. virtual void foo()virtual void foo() const是两个完全不同的功能。派生类中的const成员函数不会覆盖基类中的非const成员函数。

  2. 在选择const成员函数和非const成员函数的情况下,非const成员函数的优先级更高。

    < / LI>