欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++中Covariant返回值類(lèi)型詳解

 更新時(shí)間:2022年09月09日 10:55:49   作者:ithiker  
這篇文章主要介紹了C++中Covariant返回值類(lèi)型詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以可以參考一下

前言

C++中當(dāng)子類(lèi)覆寫(xiě)(override)父類(lèi)虛函數(shù)時(shí),子類(lèi)函數(shù)的返回值類(lèi)型可以和父類(lèi)函數(shù)的返回值類(lèi)型不一致嗎?
先說(shuō)結(jié)論:可以,但當(dāng)且僅當(dāng)它們的返回值類(lèi)型是協(xié)變返回值類(lèi)型(Covariant)時(shí)可以。C++中g(shù)cc從3.4開(kāi)始支持這一特性。

什么是協(xié)變返回值類(lèi)型(Covariant)

函數(shù)的協(xié)變返回值類(lèi)型指的是子類(lèi)中的成員函數(shù)的返回值類(lèi)型不必嚴(yán)格等同與該函數(shù)所重寫(xiě)的父類(lèi)中的函數(shù)的返回值類(lèi)型,而可以是更 “狹窄” 的類(lèi)型。C++/Java等面向?qū)ο缶幊陶Z(yǔ)言均支持協(xié)變返回值類(lèi)型。

例子:

class Shape {
public:
  virtual ~Shape() { }          
  virtual Shape* clone()  const = 0;   // Uses the copy constructor
  virtual Shape* create() const = 0;   // Uses the default constructor
};
class Circle : public Shape {
public:
  Circle* clone()  const;   // Covariant Return Types; see below
  Circle* create() const;   // Covariant Return Types; see below
 
};
Circle* Circle::clone()  const { return new Circle(*this); }
Circle* Circle::create() const { return new Circle();      }

C++中不支持virtual constructor,因?yàn)椋?/strong>

  • 創(chuàng)建對(duì)象時(shí)需要知道對(duì)象的完整信息
  • 虛函數(shù)機(jī)制也決定了對(duì)象尚未創(chuàng)建時(shí),類(lèi)的virtual table或許還不存在
  • 我們不可能有指向virtual constructor的指針

但是我們可以通過(guò)上面的代碼實(shí)現(xiàn)類(lèi)似的想法,如果我們擁有指向?qū)ο蟮闹羔槪?/strong>

  • 通過(guò)clone()調(diào)用對(duì)象的拷貝構(gòu)造函數(shù),復(fù)制當(dāng)前的對(duì)象
  • 通過(guò)create()調(diào)用默認(rèn)構(gòu)造函數(shù),創(chuàng)建新的對(duì)象

比如下面的使用場(chǎng)景:

void userCode(Shape* s)
{
  Shape* s2 = s->clone();
  Shape* s3 = s->create();
  // ...
  delete s2;   
  delete s3;
}

如果指針指向的是基類(lèi)對(duì)象,調(diào)用上述函數(shù)時(shí)返回的就是指向基類(lèi)對(duì)象的指針并賦值給s2/s3,如果指針指向的是子類(lèi)對(duì)象,調(diào)用上述函數(shù)時(shí)返回的就是指向子類(lèi)對(duì)象的指針并賦值給s2/s3。

協(xié)變返回值類(lèi)型(Covariant)的作用

協(xié)變返回類(lèi)型到底有什么用呢,編譯器為什么要支持這種語(yǔ)法?如果編譯器不支持,上面的例子將只能寫(xiě)成如下這樣:

class Shape {
public:
  virtual ~Shape() { }          
  virtual Shape* clone()  const = 0;   // Uses the copy constructor
  virtual Shape* create() const = 0;   // Uses the default constructor
};
class Circle : public Shape {
public:
  Shape* clone()  const;   // Covariant Return Types; see below
  Shape* create() const;   // Covariant Return Types; see below
 
};
Shape* Circle::clone()  const { return new Circle(*this); }
Shape* Circle::create() const { return new Circle();      }

這樣上面的userCode函數(shù)將不能通過(guò)編譯,上面調(diào)用clone函數(shù)部分將不得不改寫(xiě)成下面這樣:

 void userCode(Shape* s)
{
  Shape* s2 = s->clone();
  Circle* c = dynamic_cast<Circle*>(s2);
  if (c != NULL) {
     // c point to Circle
  } else {
	  if (s2 != NULL) {
	     // s2 point to base Shape
	     }
	  }
  }
  // ...
  delete s2;   
}

通過(guò)if/else分支來(lái)判斷s是指向子類(lèi)Circle還是指向基類(lèi)Shape,失去了動(dòng)態(tài)綁定的意義。

到此這篇關(guān)于C++中Covariant返回值類(lèi)型詳解的文章就介紹到這了,更多相關(guān)C++ Covariant內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C/C++?extern和static的使用詳解

    C/C++?extern和static的使用詳解

    這篇文章主要介紹了C/C++?extern和static的使用,在講到extern和static的時(shí)候先了解一下定義和聲明的基本概念,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • C/C++編程判斷String字符串是否包含某個(gè)字符串實(shí)現(xiàn)示例

    C/C++編程判斷String字符串是否包含某個(gè)字符串實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了C++編程中判斷String字符串是否包含某個(gè)字符串的實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • C++使用泛型導(dǎo)致的膨脹問(wèn)題

    C++使用泛型導(dǎo)致的膨脹問(wèn)題

    這篇文章主要介紹了C++使用泛型導(dǎo)致的膨脹,智能家居主機(jī)的嵌入式平臺(tái)上使用C++進(jìn)行開(kāi)發(fā)。FLASH存儲(chǔ)空間有限,這是必須要考慮的因素,一定要重視,下面我們一起進(jìn)入文章看看詳細(xì)內(nèi)容
    2021-11-11
  • C/C++ ip地址與int類(lèi)型的轉(zhuǎn)換實(shí)例詳解

    C/C++ ip地址與int類(lèi)型的轉(zhuǎn)換實(shí)例詳解

    這篇文章主要介紹了C/C++ ip地址與int類(lèi)型的轉(zhuǎn)換實(shí)例詳解的相關(guān)資料,這里提供了實(shí)例代碼,實(shí)現(xiàn)思路及實(shí)現(xiàn)方法,需要的朋友可以參考下
    2016-12-12
  • C++成員解除引用運(yùn)算符的示例詳解

    C++成員解除引用運(yùn)算符的示例詳解

    這篇文章主要介紹了C++成員解除引用運(yùn)算符,本例子在編譯期間給指針賦值,在更為復(fù)雜的類(lèi)中,可以使用指向數(shù)據(jù)成員和方法的成員指針,需要的朋友可以參考下
    2022-01-01
  • windows下用c++獲取本機(jī)ip地址的三種方法

    windows下用c++獲取本機(jī)ip地址的三種方法

    工作過(guò)程中遇到一個(gè)需求,需要獲取本機(jī)ip地址,同時(shí)獲取本機(jī)網(wǎng)絡(luò)連接情況,即網(wǎng)線(xiàn)是否連接,經(jīng)過(guò)多番搜索,本文給大家介紹了3種方案,通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • C語(yǔ)言的編程之美之內(nèi)存函數(shù)

    C語(yǔ)言的編程之美之內(nèi)存函數(shù)

    這篇文章主要介紹了C語(yǔ)言全部?jī)?nèi)存操作函數(shù)的實(shí)現(xiàn)詳細(xì)講解,作者用圖文代碼實(shí)例講解的很清晰,有感興趣的同學(xué)可以研究下
    2021-09-09
  • C++中使用function和bind綁定類(lèi)成員函數(shù)的方法詳解

    C++中使用function和bind綁定類(lèi)成員函數(shù)的方法詳解

    這篇文章主要介紹了C++中使用function和bind綁定類(lèi)成員函數(shù)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • C語(yǔ)言實(shí)現(xiàn)的程序員老黃歷實(shí)例

    C語(yǔ)言實(shí)現(xiàn)的程序員老黃歷實(shí)例

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)的程序員老黃歷,涉及日期的判定及流程控制的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • c語(yǔ)言中缺省參數(shù)的類(lèi)型總結(jié)

    c語(yǔ)言中缺省參數(shù)的類(lèi)型總結(jié)

    在本篇文章里小編給大家整理了一篇關(guān)于c語(yǔ)言中缺省參數(shù)的類(lèi)型總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-09-09

最新評(píng)論