C 虛函式和多型繼承

2021-08-11 22:51:26 字數 2528 閱讀 3916

指標和引用是很好理解的,變數的引用相當於給變數取了個別名,在函式呼叫時,傳引用是會將引數列表的值改變的。

#include 

using

namespace

std;

int main()

最終輸出的結果都是0x7ffdd9aff7b4,即為記憶體中儲存整型變數m的位址。對於虛函式,它是實現多型公有繼承的關鍵。什麼是多型呢?我們的派生類是可以使用基類的方法的,但是如果只是使用基類的方法,我們是沒有對基類方法作任何修改的,但是我們會遇到這種情況,我們希望乙個方法在基類和派生類中的行為是不一樣的,即方法的行為應取決於呼叫該物件的方法,這就是多型。實現多型有有種重要機制:(1)在派生類中重新定義基類的方法(2)使用虛方法。對於虛函式的介紹,這篇部落格寫的不錯:虛函式,指標和引用

稍帶提到一點,雖然 乙個函式定義為虛函式,那麼無論它傳下多少層,都將保持為虛函式,而不必每次都加關鍵字virtual。但是在實際的過程中加上virtual關鍵字是有必要的,這有有利於**的閱讀

這是乙個c++ primary上簡單的例子,需要開發兩個類,基類brass和派生類brassplus。在派生類中增加了幾個私有資料maxloan、rate和owesbank。我們不必知道這些變數的含義,我們不關心方法的實現,而是更關心多型性。兩個類的定義如下:

#ifndef brass_h

#define brass_h

#include

class brass

};class brassplus:public brass

void resetrate(double r);

void resetowes()

};#endif // brass_h

這裡面我們可以看到函式viewacct() const和withdraw(double amt)都被定義為虛函式。也就是表明這個函式在基類和派生類中的行為是不一樣,它們的實現如下:

#include "brass.h"

#include

using

namespace

std;

typedef ios_base::fmtflags format;

typedef streamsize precis;

format setformat();

void restore(format f,precis p);

brass::brass(const

string & s ,long an,double bal)

void brass::deposit(double amt)

void brass::withdraw(double amt)

double brass::balance() const

void brass::viewacct() const

brassplus::brassplus(const brass &ba, double ml, double r):brass(ba)

void brassplus::viewacct() const

void brassplus::withdraw(double amt)

format setformat()

void restore(format f, precis p)

這裡我們可以看到在定義viewacct()中,使用到了作用域解析運算子,假設在brassplus中定義viewacct()沒有用作用域解析運算子會怎麼樣呢?

void brassplus::viewacct() const

這樣會導致乙個問題,這裡會預設呼叫的是brassplus::viewacct(),這樣就會變成乙個遞迴呼叫,是乙個不會終止的函式。

在我們的主函式中呼叫viewacct()方法和withdraw()方法時,則不用顯示的呼叫,編譯器會根據你定義的對像確定自己的行為。下面就是乙個例子:

#include 

#include"brass.h"

using

namespace

std;

int main()

上面是通過物件呼叫的,而不是通過指標或引用,沒有使用虛方法的特性。由於使用的是公有繼承模型,因此brass指標既可以指向brass物件,也可以指向brassplus物件。所以可以使用乙個陣列來表示多種型別的物件,這就是多型性(隱士的強制轉換)。**如下:

#include

#include"brass.h"

#include

using

namespace

std;

const

int clients = 4;

int main()

while(cin.get()!='\n')

continue;

}cout

}cout

<<"done.\n";

return

0;}

C 繼承 多型 虛函式

c 支援多繼承 class parent class parent2 class child public parent,private parent2公有繼承和私有繼承的區別 public parent 公有繼承,private和public都會繼承 private parent 私有繼承,只繼承...

C 繼承 多型 虛函式 抽象

一 繼承 1 如果你以乙個 基類指標 指向 派生類物件 那麼經由該指標你只能呼叫基類所定義的函式 2 如果你以乙個 派生類指標 指向乙個 基類指標 你必須先做明顯的轉型操作。3 如果基類和派生類都定義了相同名稱的成員函式,那麼通過物件指標呼叫成員函式是,到底呼叫到那乙個函式,必須視該指標的原始型別而...

繼承 虛函式和多型小結

一.知識點總結 繼承 1.定義 在已有類的基礎上建立新類的過程。乙個 b 類繼承 a類,或稱從類 a 派生類 b類 a 稱為基類 父類 類 b 稱為派生類 子類 2.類繼承關係的語法形式 class 派生類名 基類名錶 資料成員和成員函式宣告 基類名錶 構成訪問控制 基類名1,訪問控制 基類名 2 ...