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; }