c 類的繼承和動態記憶體分配

2021-09-29 01:12:47 字數 2691 閱讀 1360

這裡假設基類已經使用了動態記憶體分配,所以繼承與動態記憶體分配的關係可分兩種情況來討論。

在這種情況下不需要為派生類重新定義複製建構函式,析構函式,過載賦值運算子。派生類將使用預設複製建構函式來實現複製功能,在複製基類的成員或資料時,派生類的預設複製函式顯式呼叫基類的複製建構函式來將基類的資料或成員複製到派生類;派生類的預設建構函式執行自身的**後會呼叫基類的析構函式,所以這種情況下不為派生類重新定義析構函式是適合的;派生類的預設賦值運算子也會自動使用基類的賦值運算子來對基類的元件進行賦值。

這種情況下要為派生類重新定義複製建構函式,析構函式,過載賦值運運算子。定義派生類複製建構函式時,由於派生類的複製建構函式只能訪問本身的資料,故要呼叫基類的複製建構函式來複製基類的資料;定義派生類的析構函式時,只需要對派生類執行的操作進行清除即可,基類會自動呼叫本身的析構函式;派生類的賦值運算除了負責本身的資料外,還要負責基類的資料,這時就跟複製建構函式一樣,通過使用基類的賦值運算子來實現派生類中基類部分資料的賦值。

具體的例子如下所示:

標頭檔案:

#pragma once

#ifndef _dma_h_

#define _dma_h_

#include

class

basedma

;class

lacksdma

:public basedma

;char color[col_len]

;public

:lacksdma

(const

char

* c =

"blank"

,const

char

* l =

"null"

,int r =0)

;lacksdma

(const

char

* c,

const basedma& rs)

;friend std::ostream&

operator

<<

(std::ostream& os,

const lacksdma& rs);}

;class

hasdma

:public basedma

;#endif

標頭檔案中的有關方法的定義檔案如下:

#include

"dma.h"

#include

//基類basedma的方法

basedma::

basedma

(const

char

* l,

int r)

basedma::

basedma

(const basedma& rs)

basedma::

~basedma()

basedma& basedma::

operator=(

const basedma& rs)

;std::ostream&

operator

<<

(std::ostream& os,

const basedma& rs)

//lacksdma的方法

lacksdma::

lacksdma

(const

char

* c,

const

char

* l,

int r)

:basedma

(l,r)

lacksdma::

lacksdma

(const

char

* c,

const basedma& rs)

:basedma

(rs)

std::ostream&

operator

<<

(std::ostream& os,

const lacksdma& rs)

//hasdma類的方法

hasdma::

hasdma

(const

char

* s ,

const

char

* l,

int r)

:basedma

(l,r)

hasdma::

hasdma

(const

char

* s,

const basedma& rs)

:basedma

(rs)

hasdma::

hasdma

(const hasdma& hs)

:basedma

(hs)

hasdma::

~hasdma()

hasdma& hasdma::

operator=(

const hasdma& rs)

std::ostream&

operator

<<

(std::ostream& os,

const hasdma& rs)

相應的測試程式檔案如下:

#include

#include

"dma.h"

intmain()

C 類和動態記憶體分配

預設析構函式 複製建構函式 賦值運算子 位址運算子 ifndef zhumeng h define zhumeng h include class zhumeng endif include zhumeng.h int zhumeng numm 0 zhumeng zhumeng zhumeng z...

C 類和動態記憶體分配

如果有這樣的strbad類 include ifdef strbad h define srebad h class strbad endif include include stringbad.h using std cout int strbad num 0 靜態成員變數不能在宣告中初始化 除非...

C 之繼承和動態記憶體分配

c 之繼承和動態記憶體分配 如果基類使用動態記憶體分配,並重新定義賦值和複製建構函式,這將如何影響派生類的實現呢?這取決於派生類的屬性,如果派生類也使用動態記憶體分配,這將如何實現呢?這種大致分為兩種情況,第一種情況 派生類不使用new 這將不需要在派生類中顯式的定義析構函式,複製建構函式,賦值操作...