prettify

Oct 17, 2016

C++ 11: override

The C++ 11 have a new keyword: "override". Let me use an example to explain how it works.

#include 

class base
{
  public:
    virtual void f1()
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    };
    virtual void f2() final
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
    virtual void f3()
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
    void f4()
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
    virtual void f5()
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
};

class child final: public base
{
  public:
    virtual void f1() override//(1)
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
    /*virtual void f2()override//(2)
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }*/
    /*virtual void f2()(3)
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }*/
    /*void f2()(4)
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }*/
    virtual void f3()//(5)
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
    /*virtual void f4()override//(6)
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }*/
    virtual void f4()//(7)
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
    void f5() override//(8)
    {
      std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
};

int main()
{
  std::cout << "base" << std::endl;
  base a;
  a.f1();
  a.f2();
  a.f3();
  a.f4();
  a.f5();

  std::cout << "child" << std::endl;
  child b;
  b.f1();
  b.f2();
  b.f3();
  b.f4();
  b.f5();

  std::cout << "base*" << std::endl;
  base* p = new child();
  p->f1();
  p->f2();
  p->f3();
  p->f4();
  p->f5();
}

Run and I got the following results
4:50pm - ran 90 lines of C++ (finished in 766ms):
base 
virtual void base::f1() 
virtual void base::f2() 
virtual void base::f3() 
void base::f4() 
virtual void base::f5() 
child 
virtual void child::f1() 
virtual void base::f2() 
virtual void child::f3() 
virtual void child::f4() 
virtual void child::f5() 
base* 
virtual void child::f1() 
virtual void base::f2() 
virtual void child::f3() 
void base::f4() 
virtual void child::f5() 


Here are the comments( refer to the child class code)
(1) explicitly override a base class virtual function, that's ok
(2) explicitly override a base class final virtual function, that's not allowed by compiler
(3) implicitly override a base class final virtual function, that's not allowed by compiler
(4) not allowed by compiler since the base f2() is final
(5) implicitly  override a base class virtual function, compiler won't point out the issue if the base virtual function does not exist
(6) override can not works with virtual function, compiling error
(7) declare f4() as virtual, this is modify, not overide
(8) no virtual required here

No comments:

Post a Comment