成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

EasyC++,繼承和動態(tài)內存分配

開發(fā) 后端
當我們的基類使用動態(tài)內存分配,并且重新定義賦值和復制構造函數,這會對派生類的實現有什么影響呢?

繼承和動態(tài)內存分配

今天這篇文章來聊聊繼承與動態(tài)內存分配。

這里面有一個問題,當我們的基類使用動態(tài)內存分配,并且重新定義賦值和復制構造函數,這會對派生類的實現有什么影響呢?

我們來看兩種情況。

派生類不用new

假設基類中使用了動態(tài)內存分配:

  1. class baseDMA { 
  2.  private: 
  3.      char *label; 
  4.      int rating; 
  5.     public
  6.      baseDMA(const char* l="null"int r=0); 
  7.      baseDMA(const baseDMA& rs); 
  8.      virtual ~baseDMA(); 
  9.      baseDMA &operator=(const baseDMA& rs); 
  10. }; 

在這個聲明里包含了構造函數、析構函數、復制構造函數和重載賦值運算符。

現在假設我們從baseDMA派生出了類lackDMA,但是后者不使用new:

  1. class lackDMA: public baseMDA { 
  2.    private: 
  3.      char color[40]; 
  4.     public
  5.      ... 
  6. }; 

問題來了,我們要不要給lackDMA這個類定義析構函數、復制構造函數和賦值運算符呢?

答案是不需要。

首先是析構函數,這個很好想明白,如果我們沒有定義析構函數,那么編譯器會自動定義一個不執(zhí)行任何操作的默認析構函數。實際上派生類的析構函數往往會在執(zhí)行一些邏輯之后調用基類的構造函數,因為lackDMA類中的成員不是通過new創(chuàng)建的,因此不需要額外的操作,所以默認析構函數是合適的。

同樣的默認復制構造函數也會執(zhí)行非new創(chuàng)建成員的復制,所以對于color變量來說是沒問題的。并且在派生類當中,默認復制構造函數除了會復制非new創(chuàng)建的成員之外,還會調用基類的復制構造函數來復制父類成員的部分。所以,對于派生類lackDMA來說,我們使用默認的復制構造函數一樣沒有問題。

賦值也是一樣的,默認的賦值運算符也會自動使用基類的賦值運算符來對基類的成員進行賦值。

派生類使用new

我們再來看看派生類當中使用了new的情況。

  1. class hasDMA: public baseMDA { 
  2.    private: 
  3.      char *style; 
  4.     public
  5.      ... 
  6. }; 

在hasDMA這個類當中,我們添加了一個需要使用new創(chuàng)建的char*成員。在這種情況下,我們就沒辦法使用默認的函數了,就必須定義顯式析構函數、復制構造函數和賦值運算符了,我們一個一個來看。

首先是析構函數,派生類的析構函數會自動調用基類的析構函數,所以我們只需要在析構函數當中釋放派生類中獨有的成員變量即可。

  1. hasDMA::~hasDMA() { 
  2.     delete []style; 

然后我們再來看看拷貝構造函數,由于派生類不能訪問基類private成員,所以我們需要調用基類的拷貝構造函數。

  1. hasDMA::hasDMA(const hasDMA& hs): baseDMA(hs) { 
  2.     style = new char[std::strlen(hs.style) + 1]; 
  3.     std::strcpy(style, hs.style); 

最后是賦值運算符,同樣,由于派生類不能訪問基類中私有成員,我們也需要借助基類的賦值運算符:

  1. hasDMA &hasDMA::operator(const hasDMA& hs) { 
  2.     if (this == &hs) return *this; 
  3.     baseDMA::operator=(hs); 
  4.     delete []style; 
  5.     style = new char[std::strlen(hs.style) + 1]; 
  6.     std::strcpy(style, hs.style); 
  7.     return *this; 

這當中有一個語句看起來有些奇怪:

  1. baseDMA::operator=(hs); 

這是我們手動顯式調用了基類的賦值運算符,我們直接用等于號賦值也有同樣的效果:

  1. *this = hs; 

為什么不這么干呢?這是因為編譯器在執(zhí)行的時候會默認調用子類的賦值運算符hasDMA::operator=,從而導致一直遞歸導致死循環(huán)。

 

所以我們需要手動寫明作用域解析符,表明這是調用的父類賦值運算符,而非派生類的運算符,這一點比較隱晦,要千萬注意。

 

責任編輯:武曉燕 來源: Coder梁
相關推薦

2021-12-01 10:50:31

C++存儲動態(tài)

2021-12-30 14:58:58

C++函數動態(tài)

2021-12-12 18:13:54

C++This指針

2021-12-29 20:31:40

C++多態(tài)指針

2021-11-09 10:38:16

C++Const指針

2021-11-26 00:03:20

C++編譯常量

2021-12-09 10:56:50

函數C++原型

2022-01-13 10:30:21

C語言內存動態(tài)

2021-11-30 11:04:36

C++函數語言

2021-12-08 10:43:09

C++實現

2021-12-10 10:45:36

C++函數Stock

2021-10-26 00:19:51

C++結構體存儲

2021-12-11 19:02:03

函數C++對象

2021-11-27 11:50:09

C++靜態(tài)持續(xù)

2021-12-03 10:48:18

Using編譯指令

2021-11-10 10:48:36

C++函數指針

2021-10-26 15:36:17

C++枚舉值類型

2021-10-27 16:27:20

C++指針操控

2021-12-05 18:20:42

C++空間特性

2021-12-15 10:25:57

C++運算符重載
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品久久香蕉国产线看观看亚洲 | 一级毛片视频 | 国产乱码精品一区二区三区忘忧草 | 一级毛片色一级 | 成人av一区二区三区 | 9191av| 婷婷亚洲综合 | 日韩在线视频免费观看 | 亚洲首页| 99久久精品国产毛片 | 国产情侣激情 | 一级a性色生活片久久毛片 一级特黄a大片 | 色综合久久久 | 成人午夜激情 | 久久99蜜桃综合影院免费观看 | 成人福利 | 成人免费一区二区三区视频网站 | 6996成人影院网在线播放 | 亚洲人人舔人人 | 午夜二区 | 狠狠操网站 | 亚洲天堂中文字幕 | 成人国产精品久久久 | 91久久精品一区二区二区 | 美国a级毛片免费视频 | 亚洲欧美中文日韩在线v日本 | 免费看黄色视屏 | 91欧美精品成人综合在线观看 | 皇色视频在线 | 在线免费观看毛片 | 每日在线更新av | 久久久精品视 | 欧美性受xxxx白人性爽 | 国产精品久久久久久久久动漫 | 亚洲一区中文字幕 | 久久精品99国产精品日本 | 精品欧美黑人一区二区三区 | 黄色福利 | 国产96在线 | av在线天堂 | 久久久青草 |