c++11 繼承控制:final和override


c++11 繼承控制:final和override

 

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <string>
#include <vector>
#include <map>

// C++11之前,一直沒有繼承控制關鍵字,禁用一個類的進一步衍生比較麻煩。
/*
C++ 11添加了兩個繼承控制關鍵字:final和override。
final阻止類的進一步派生和虛函數的進一步重寫
override確保在派生類中聲明的函數跟基類的虛函數有相同的簽名

在C++中,只要原來的返回類型是指向類的指針或引用,新的返回類型是指向派生類的指針或引用,覆蓋的方法就可以改變返回類型。這樣的類型稱為協變返回類型(Covariant returns type).
返回類型的協變(covariance)指返回類型是接口或委托定義返回類型的子類,
參數類型的逆變(contravariance)是指實現的參數類型是接口或委托定義的參數類型的父類。
*/
class B1 final {}; // 此類不能被繼承
//class D1: public B1 {}; // error!

class B
{
public:
    //  virtual void func() override // error! 指定了重寫但實際並沒重寫,沒有基類
    //  {
    //      std::cout << __func__ << std::endl;
    //  }
    virtual void f() const
    {
        std::cout << __func__ << std::endl;
    }
    virtual void fun()
    {
        std::cout << __func__ << std::endl;
    }
};

class D : public B
{
public:
    virtual void f(int)      // ok! 隱藏,由於沒有重寫同名函數B::f,在D中變為不可見
    {
        std::cout << "hiding: " <<__func__ << std::endl;
    }
    //  virtual void f() override   // error! 指定了重寫但實際並沒重寫,類型聲明不完全相同
    //  {
    //      std::cout << __func__ << std::endl;
    //  }
    virtual void fun() override final // ok! 指定了重寫實際上也重寫了,同時,指定為最終,后代類中不能再重寫此虛函數
    {
        std::cout << __func__ << std::endl;
    }
};

class D2 : public D
{
public:
    virtual void f() const      // ok! 重寫B::f(),同時,由於沒有重寫D::f(int),在D2中變不可見
    {
        std::cout << __func__ << std::endl;
    }
    //  virtual void fun() // error! 基類的此虛函數被指定為最終,不能被重寫,雖然沒有顯示指定"override"
    //  {
    //      std::cout << __func__ << std::endl;
    //  }
    //  virtual void fun() override // error! 基類的此虛函數被指定為最終,不能被重寫
    //  {
    //      std::cout << __func__ << std::endl;
    //  }
};


void mytest()
{

    return;
}


int main()
{
    mytest();

    system("pause");
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM