日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++动态绑定及返回类型协变

發布時間:2023/12/20 c/c++ 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++动态绑定及返回类型协变 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++多態之動態綁定:

?

1、概念:在程序執行期間(非編譯期)判斷所引用對象的實際類型,根據其實際類型調用相應的方法。

使用virtual關鍵字修飾類的成員函數時,指明該函數為虛函數,派生類需要重新實現,編譯器將實現動態綁定。

2、條件:a)必須是虛函數。? b)通過基類類型的引用或者指針調用虛函數。

?

?

class Base

{

public:

??? Base()

??? {

???????cout<<"Base:: Base()"<<endl;

??? }

?

??? ~Base()

??? {

??????? cout<<"Base::~Base()"<<endl;

??? }

?

??? virtual void Test1()

??? {

???????cout<<"Base:: Test1()"<<endl;

??? }

?

??? int sum(int a, int b)

??? {

??????? cout<<"Base:: sum =a+b"<<endl;

??????? return a+b;

??? }

};

?

class Derived:public Base

{

public:

??? Derived()

??? {

??????? cout<<"Derived::Derived()"<<endl;

??? }

???

??? ~Derived()

??? {

??????? cout<<"Derived::~Derived()"<<endl;

??? }

protected:? ? //基類為public

??? virtual void Test1()

??? {

???????cout<<"Derived:: Test1()"<<endl;

??? }

?

??? virtual int sum(int a, int b)

??? {

??????? cout<<"Derived:: sum= a+b"<<endl;

??????? return a+b;

??? }

?

};

?

void FunTest1(Base& b)? //通過基類的指針或引用訪問派生類的成員

{

??? b.Test1();

}

?

void FunTest()

{

??? Derived d;

??? Base b;

?

??? Base& pBase = d;

?

??? FunTest1(b);

??? FunTest1(d);

???

??? cout<<"sum = "<<pBase.sum(1,2)<<endl;

}

?

?

?

?

?

當修改了派生類中重寫的虛函數與原來的返回值不同,編譯器報錯。

?

?

故重寫(覆蓋)要求具有相同的參數和返回值。而這個規則對于協變則會放松。

?

3、協變:

在C++中,只要原來的返回類型是基類類型的指針或引用,新的返回值類型是派生類的指針或引用,覆蓋的方法就可以改變返回類型,這樣的返回類型稱為協變返回類型。

class Base

{

public:

??? Base()

??? {

???????cout<<"Base:: Base()"<<endl;

??? }

?

??? ~Base()

??? {

??? ??? cout<<"Base::~Base()"<<endl;

??? }

??? virtual Base& operator=(const Base& b)

??? {

??????? cout<<"Base::operator=(const Base& b)"<<endl;

??????? return *this;

??? }

?

};

?

class Derived:public Base

{

public:

??? Derived()

??? {

???????cout<<"Derived:: Derived()"<<endl;

??? }

???

??? ~Derived()

??? {

??????? cout<<"Derived::~Derived()"<<endl;

??? }

??? virtual Derived& operator=(const Base& b)

??? {

??????? cout<<"Derived::operator=(const Base& b)"<<endl;

??????? return *this;

??? }

?

};

?

?

void FunTest()

{

??? Derived d1,d2;

??? Base b;

?

??? Base& pBase = d1;

??? pBase.operator=(d2);

?

}




協變返回類型的優勢在于,總是可以在適當程度的抽象層面工作。目前,一般認為,返回值可以協變,參數則不可以。?
??因此,在C++標準的虛函數中,返回值協變,參數不變。

總結

以上是生活随笔為你收集整理的C++动态绑定及返回类型协变的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。