Sat*_*evi 184 c++ overriding c++11
我是C++的初学者.我遇到override了我正在处理的头文件中使用的关键字.我可以知道,真正的用途是什么override,或许用一个例子就很容易理解.
Mat*_*son 282
该override关键字有两个用途:
解释后者:
class base
{
  public:
    virtual int foo(float x) = 0; 
};
class derived: public base
{
   public:
     int foo(float x) override { ... do stuff with x and such ... }
}
class derived2: public base
{
   public:
     int foo(int x) override { ... } 
};
在derived2编译器中将发出"更改类型"的错误.如果没有override,编译器最多会发出警告"你正在隐藏同名虚拟方法".
zau*_*ufi 64
作为所有答案的补充,FYI:override 不是关键字,而是一种特殊的标识符!它仅在声明/定义虚函数的上下文中有意义,在其他上下文中它只是一个序数标识符.有关详细信息,请阅读标准 2.11.2 .
#include <iostream>
struct base
{
    virtual void foo() = 0;
};
struct derived : base
{
    virtual void foo() override
    {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
};
int main()
{
    base* override = new derived();
    override->foo();
    return 0;
}
输出:
zaufi@gentop /work/tests $ g++ -std=c++11 -o override-test override-test.cc
zaufi@gentop /work/tests $ ./override-test
virtual void derived::foo()
override是一个C++ 11关键字,这意味着一个方法是来自基类的方法的"覆盖".考虑这个例子:
   class Foo
   {
   public:
        virtual void func1();
   }
   class Bar : public Foo
   {
   public:
        void func1() override;
   }
如果B::func1()签名不等于A::func1()签名,则会生成编译错误,因为B::func1()不会覆盖A::func1(),它将定义一个名为的新方法func1().
| 归档时间: | 
 | 
| 查看次数: | 193377 次 | 
| 最近记录: |