c++ - const 和虚拟继承

标签 c++ inheritance constants

<分区>

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");
}

当我运行此代码时,会打印“In Base”。为什么使用 const 说明符会改变继承?

最佳答案

const 改变了函数的签名。所以这是一个 overload不是 override .

如果你想确保不犯这些错误,你可以使用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";
    }
};

关于c++ - const 和虚拟继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36656847/

相关文章:

javascript - 如何继承和链接String而不污染String.prototype?

c++ - 使用 std::function 参数重载函数:为什么从未调用 const 方法?

c++ - 根据数字参数更改模板成员?

具有更友好错误消息的 C++ IDE

C++ 新的 std::vector of pointers

c++ - 嵌套类继承自嵌套类

c++ - 使用opengl进行真正的等距投影

python - 当类没有继承任何内容时,从命令行调用 python 脚本会出现语法错误,这是为什么?

perl - 从 Perl 模块导出所有常量(只读变量)的最有效方法是什么

Ruby:常量查找在 instance_eval/class_eval 中如何工作?