添加override了C++ 11 以确保您编写的要覆盖基类虚函数的成员函数实际上(或不会编译).
但是在大型对象层次结构中,有时您可能会意外地编写一个成员函数,当您不想要它时会覆盖基类虚拟!例如:
struct A {
virtual void foo() { } // because obviously every class has foo().
};
struct B : A { ... };
class C : B {
private:
void foo() {
// was intended to be a private function local to C
// not intended to override A::foo(), but now does
}
};
Run Code Online (Sandbox Code Playgroud)
是否有一些编译器标志/扩展名至少会发出警告C::foo?为了便于阅读和正确,我只想强制所有覆盖使用override.
虚拟限定符到基类的虚函数,在派生类中有什么区别?
class b
{
public:
virtual void foo(){}
};
class d : public b
{
public:
void foo(){ .... }
};
Run Code Online (Sandbox Code Playgroud)
要么
class d : public b
{
public:
virtual void foo(){ .... }
};
Run Code Online (Sandbox Code Playgroud)
这两个声明有什么不同,除了它让d的孩子知道foo()的虚拟性?
我注意到C++中有密封和接口关键字.这仅适用于CLR C++吗?如果没有,什么时候密封和接口添加到C++标准?它们在C++中的含义与它们在C#中的含义相同吗?如果没有,我如何获得标准C++中的等价物?
在任何级别的后代类中,显式标记为虚拟是否都会覆盖?
class Base {
// ...
protected:
virtual void to_be_derived() const; // First level to introduce this virtual function
};
class LevelOne : public Base {
// ...
protected:
// virtual??
void to_be_derived() const;
};
class LevelTwo : public levelOne {
// ...
protected:
// virtual??
void to_be_derived() const;
};
Run Code Online (Sandbox Code Playgroud)
我没有看到Prefixing虚拟关键字覆盖了我的问题的覆盖方法.特别是,其中一个答案已更新,以反映c ++ 11的当前用法,特别override是我不知道的关键字!
编辑:我宁愿接受关于post-c ++ 11代码的链接问题的另一个答案.