最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中Covariant返回值類型詳解

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

前言

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

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

函數(shù)的協(xié)變返回值類型指的是子類中的成員函數(shù)的返回值類型不必嚴格等同與該函數(shù)所重寫的父類中的函數(shù)的返回值類型,而可以是更 “狹窄” 的類型。C++/Java等面向?qū)ο缶幊陶Z言均支持協(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:
  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,因為:

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

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

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

比如下面的使用場景:

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

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

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

協(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ù)將不能通過編譯,上面調(diào)用clone函數(shù)部分將不得不改寫成下面這樣:

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

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

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

相關文章

  • C++跳轉(zhuǎn)語句之Goto對變量定義的影響詳解

    C++跳轉(zhuǎn)語句之Goto對變量定義的影響詳解

    goto語句也被稱為無條件轉(zhuǎn)移語句,這篇文章主要介紹了C++跳轉(zhuǎn)語句之Goto對變量定義的影響,文中通過示例代碼解文字介紹的很詳細,相信對大家的理解和學習具有一定的參考借鑒價值,有需要的朋友們下面跟著小編一起來學習學習吧。
    2016-11-11
  • 簡單分析針對ARM平臺的C語言程序的編譯問題

    簡單分析針對ARM平臺的C語言程序的編譯問題

    這篇文章主要介紹了針對ARM平臺的C語言程序的編譯問題,從優(yōu)化編譯選項的幾個方面進行分析,需要的朋友可以參考下
    2015-12-12
  • 淺析C++中dynamic_cast和static_cast實例語法詳解

    淺析C++中dynamic_cast和static_cast實例語法詳解

    這篇文章主要介紹了淺析C++中dynamic_cast和static_cast實例演示,包括static_cast語法知識和static_cast的作用講解,namic_cast 語法詳解,需要的朋友可以參考下
    2021-07-07
  • 華為面試題答案找出最大長度子字符串

    華為面試題答案找出最大長度子字符串

    找出最大長度子字符串,打印并且返回長度。 例如 str = "abc123abcd234abcdefgha324adsdawqdasdaseqqwe345abchded",看下面的代碼實現(xiàn)吧
    2013-12-12
  • C語言選擇排序算法及實例代碼

    C語言選擇排序算法及實例代碼

    本篇文章主要介紹了 C語言選擇排序算法,這里提供代碼實例以便大家理解,通過本文,更好的理解排序算法
    2016-07-07
  • C++實現(xiàn)LeetCode(557.翻轉(zhuǎn)字符串中的單詞之三)

    C++實現(xiàn)LeetCode(557.翻轉(zhuǎn)字符串中的單詞之三)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(557.翻轉(zhuǎn)字符串中的單詞之三),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言數(shù)據(jù)結(jié)構(gòu)中數(shù)制轉(zhuǎn)換實例代碼

    C語言數(shù)據(jù)結(jié)構(gòu)中數(shù)制轉(zhuǎn)換實例代碼

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)中數(shù)制轉(zhuǎn)換實例代碼的相關資料,需要的朋友可以參考下
    2017-03-03
  • 使用C++和代理IP實現(xiàn)天氣預報的采集

    使用C++和代理IP實現(xiàn)天氣預報的采集

    在當今的互聯(lián)網(wǎng)時代,網(wǎng)絡信息的獲取變得日益重要,天氣預報信息作為日常生活的重要參考,其獲取方式也隨著技術的發(fā)展而不斷變化,在本文中,我們將探討如何使用C++和代理IP來采集天氣預報信息,文中通過代碼講解的非常詳細,需要的朋友可以參考下
    2023-12-12
  • C/C++判斷素數(shù)的三種方法

    C/C++判斷素數(shù)的三種方法

    這篇文章主要給大家介紹了C/C++判斷素數(shù)的三種方法,常規(guī)的函數(shù)判斷法,埃氏篩法和歐拉篩法這三種方法,并通過代碼示例講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2023-12-12
  • C語言實現(xiàn)登錄注冊和忘記密碼功能

    C語言實現(xiàn)登錄注冊和忘記密碼功能

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)登錄、注冊和忘記密碼功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12

最新評論

梧州市| 柯坪县| 靖安县| 孝昌县| 来凤县| 静安区| 磴口县| 应城市| 石门县| 台南县| 延吉市| 永靖县| 桐乡市| 北票市| 嘉义县| 凤阳县| 长岛县| 百色市| 和龙市| 镇坪县| 信宜市| 上蔡县| 南宁市| 沙坪坝区| 宜丰县| 舒城县| 鲁山县| 辽中县| 阿拉善左旗| 卫辉市| 黄骅市| 侯马市| 康马县| 宾阳县| 汉川市| 石渠县| 文成县| 雷波县| 陵川县| 上饶市| 喜德县|