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说明符来改变继承?
答案 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)
virtual void foo()
和virtual void foo() const
是两个完全不同的功能。派生类中的const
成员函数不会覆盖基类中的非const
成员函数。
在选择const
成员函数和非const
成员函数的情况下,非const
成员函数的优先级更高。