關於c基類派生類的引用和指標,關於C 基類 派生類的引用和指標

時間 2021-09-17 08:23:57

1樓:匿名使用者

(1)首先回答第一個問題:用基類的指標指向派生類的物件,這樣做可以體現c++的重要特性:多型性。

多型性其實也就是動態聯編。這樣做的好處是:當基類裡面定義了一個虛成員函式的時候,其派生類裡面定義了同名的函式可以實現覆蓋。

你的基類指標指向那個物件,就呼叫那個物件的該方法。我舉個例子你應該就明白了:

class shape //基類:形狀

; //虛擬函式

…… ……

};class circle:pulic shape //派生類:圓

; //覆蓋基類的同名函式

…… ……

};class square:pulic shape //派生類:正方形/長方形

; //覆蓋基類的同名函式

…… ……

};定義一個基類指標:

shape* pshape=null;

circle c;

squre s;

pshape = &c;

pshape->calcarea(); //呼叫的是計算圓circle類的calcarea();

pshape = &s;

pshape->calcarea(); //呼叫的是計算四邊形square類的calcarea();

(2) 如果你能看明白上面的,第二個的問題就很簡單了:

b b; //定義一個派生類b的物件b

a &rb=b; //定義並初始化一個物件b的引用

(3)還有補充問題呀,那來個補充回答:

引用就是別名,rb和b的訪問範圍應該是一樣的。他們指向同一個記憶體區域,修改rb和修改b都會影響b的內容。

2樓:

基類指標與派生類指標的相互轉換

1,直接用基類指標引用基類物件

2,直接用派生類指標引用派生類物件

3,用基類指標引用一個派生類物件,由於派生類物件也是基類的物件,所以這種引用是安全的,

但是隻能引用基類成員。若試圖通過基類指標引用那些只在派生類中才有的成員,編譯器會報告語法錯誤。(解決該問題的答案是虛擬函式和多型性)

4,用派生類指標引用基類的物件。這種引用方式會導致語法錯誤。派生類指標必須先強制轉換為基類指標,這種方法是安全的。

而在侯捷的深入淺出mfc中第二章c++重要性質中:

1、如果你以一個"基類之指標"指向一個"派生類之物件",那麼經由該指標你只能呼叫該基類所定義的函式

2、如果你以一個“派生類之指標”指向一個“基類之物件”,你必須先做明顯的轉型操作(explicit cast),這種作法很危險。

3、如果基類和派生類都定義了“相同名稱之函式”,那麼通過物件指標呼叫成員函式時,到底呼叫了那個函式,必須視該指標的原始型別而定,而不是視指標實際所指的物件的型別而定,這與第1點其實意義相通。

#include

#include

using namespace std;

class a

3樓:陳宗權

基類的指標或者引用指向派生類的例項,這在物件導向程式設計中使用極其普遍。

a *pa = new b;這是一個基類指標指向一個派生類的例項。

b b; a &rb=b;這是一個基類引用指向(引用)派生類的例項。

至於這個指標pa和引用rb的訪問範圍,完全由pa和rb定義所在的範圍決定,跟它們所指向的目標無關。

通過基類指標或者引用來訪問派生類例項的意義在於,這種指標和引用可以通用於訪問這個基類之下的所有派生類的物件,這一方面可以使用物件導向的“多型”特性,通過這個基類指標或者引用來呼叫虛擬函式的時候,實際執行的是派生類物件的函式,使用這個指標或者引用的一方的**不必隨著派生類的不同而改變,卻可以達到執行最適合這個派生類的函式(也就是這個派生類自己的成員函式)的目的;另一方面可以使程式模組具有很好的可替換性,用一個派生類替換另一個派生類,程式的其它部分不需要做任何改動就可以正常執行而且發揮出新的派生類的特性。

ps:基類指標和引用可以用來訪問派生類物件是把派生類物件看成基類物件。理論基礎是:一個派生類物件一定也是一個基類物件。

c++為何無法用指標引用這些派生類成員函式

4樓:育知同創教育

參考下面**

#include

using namespace std;

struct param;

struct circleparam:public param;

class point

virtual void print()

c# 基類引用變數引用派生類物件問題?

5樓:星辰緋櫻

變數所開闢的地址取決與使用new時的物件,例如new b()中,開闢的就是物件b的空間。

而a a = b;這樣的**,只是將物件首地址的指標又重新賦值給了變數a。(在這裡,你可能錯誤的理解的引用物件的宣告。引用型別的變數宣告只是一個4位元組的棧引用,這個引用標識著該引用地址的起始區間,也就是這個引用可以訪問到的記憶體地址區間。

)但因為b所引用的是物件b所開闢的空間,所以有這樣的偽**也是成立的:

a a = new b();

b b = (b)a;

這裡同理,a的引用一樣訪問不到子類b的name屬性。但是進行強轉後,b是可以訪問到b的name屬性的,因為這兩個變數a和b都是指向類b所開闢的記憶體空間。

引用變數**於數學,是計算機語言中能儲存計算結果或能表示值抽象概念。變數可以通過變數名訪問。在指令式語言中,引用變數通常是可變的;但在純函式式語言中,變數可能是不可變的。

⒈pt 是引用變數,申明引用變數時必須將其初始化.pt 和rate 的值指向相同的記憶體變數. 引用的最多用處就是作為函式的引數(結構和物件).

通過引用變數作引數可以是函式使用原始資料.而不是拷貝.

⒉引用的特點更接近於const 指標,一旦與某個變數關聯起來就將一直效忠於它,可以通過初始化來設定此時,rate的值和 pt的值都改為了30 但是地址還是原來rate的地址.而不是other的地址.

⒊如果程式不想改變傳遞給它的資訊,但是又想使用引用,那麼則應該使用常量引用

c++基類指標指向派生類物件

6樓:匿名使用者

//動態聯編與虛擬函式。

//動態繫結聯編工作在程式執行時執行,在程式執行時才確定將要呼叫的函式。虛擬函式是動態繫結的基礎。

//是非靜態的成員函式。

//在類的宣告中,在函式原型之前寫virtual。

//virtual 只用來說明類宣告中的原型,不能用在函式實現時。

//具有繼承性,基類中宣告瞭虛擬函式,派生類中無論是否說明,同原型函式都自動為虛擬函式。

//本質:不是過載宣告而是覆蓋。

//呼叫方式:通過基類指標或引用,執行時會根據指標指向的物件的類,決定呼叫哪個函式。

#include

class b0 //基類b0宣告

void main() //主函式

7樓:匿名使用者

因為這個函式你沒有宣告為虛擬函式。

c++中基類指標指向派生類時,呼叫的虛擬函式是派生類的,為什麼要這樣啊?

8樓:

直接用子類物件呼叫函式當然沒問題,基類指標指向派生類物件是多型性的體現。

什麼是多型呢?多型就是不同物件接受相同的訊息,但是卻產生不同的行為,舉一個很簡單的例子,有一個圖形類,他有幾個派生類,如圓形,三角形,矩形。圖形類有一個函式area();用來求面積,但是由於不同圖形求面積的方法不同,要由具體的派生類來決定,所以可以把它定義為一個虛擬函式,由派生類來過載這個函式,所以不同的派生類裡面area()函式的函式體是不同的,

建立一個基類指標*p,讓他指向不同的派生類物件,p在呼叫area()方法時,就會呼叫派生類的area()方法了。

多型的一個好處就是提高了**的重用性,如果圖形類又有一個新的派生類五邊形,要求他的面積只需要把剛才的p指標再指向一個五邊形物件,而其他的**無需任何更改!

在附上例子吧!

class shape

class circle: public shape

}class ********: public shape

}class rectangle: public shape

}int main()

只是大概意思,供參考。

9樓:

虛擬函式的作用是: 在呼叫函式時再確定呼叫哪個物件的函式.

如果物件是被初始化為子類的, 就呼叫子類的函式; 如果物件是被初始化為父類的, 就呼叫父類的函式.

10樓:匿名使用者

直接用派生類的物件是可以的。但是虛擬函式的作用體現在多型上。

比如類a是個基類,類b,c,d由類a繼承。

現在我要寫個函式func1,對bcd三個類的物件都通用,函式內部呼叫bcd三個類都有的一個函式func2。

但是bcd三個類是不同的類,那麼這個函式可能就要過載三次,寫成func1(b b);

func1(c c);

func1(d d);

這樣才能區分傳進去的是哪個類的物件在呼叫func2,這樣在繼承得多了的時候顯得很麻煩。虛擬函式多型就可以解決這樣的問題。

把func2在類a中定義成虛擬函式,然後只要寫一個func1func1(a *a);

此時傳b *b,c *c,d *d三個指標物件進去,都可以相應的呼叫各自的func2了。這是物件導向思想的一個體現

c++中基類指標指向派生類物件可以呼叫派生類的新增成員麼

11樓:匿名使用者

no!基類指bai針告訴du

編譯器它的靜態類zhi型是基類這種型別dao,所以限定了這個指標回只能呼叫基類的自有

答成員。這個其實無關於他指向什麼型別物件。

但是,你作為這個指標的寫作者,你當然知道這個基類指標指向的是派生類物件。所以,可以將這個基類指標強制轉換為派生類指標(就是強制編譯器把這個指標靜態型別看作派生型別),靜態型別表明了一個物件 能執行的所有動作(成員函式)+它的自有屬性(資料成員),這樣派生類的新增成員就可以被這個指標呼叫了

動態繫結的重寫基類的virtual方法並不是派生類新增成員,而是重寫(override)。

12樓:欲動精靈

可以 其實這就是動態繫結嘛

該指標所繫結的物件就是派生類物件,它當然可以呼叫派生類的所有公有介面

C派生類指標指向基類物件,C 中基類指標指向派生類物件可以呼叫派生類的新增成員麼

需要知道一些常識,乙個類所有的函式都是再code 區中唯一的存放乙份。而資料成員則是每個物件儲存乙份,並按照宣告順序依次存放。類a中有了虛函式就會再類的資料成員的最前面新增乙個vfptr指標 void vfptr 這個指標用來指向乙個vtable表 乙個函式指標陣列 乙個類只有乙個該錶 該錶儲存著當...

C 基類指標指向派生類指標時,指標可以用派生類的非虛方法嗎

需要知道一些常識,一個類所有的函式都是再code 區中唯一的存放一份。而資料成員則是每個物件儲存一份,並按照宣告順序依次存放。類a中有了虛擬函式就會再類的資料成員的最前面新增一個vfptr指標 void vfptr 這個指標用來指向一個vtable表 一個函式指標陣列 一個類只有一個該表 該表儲存著...

C派生類繼承基類的所有成員,包括基類的私有成員

樓主你好。答案就是 繼承了,但是無法訪問。為什麼呢?我們用乙個例子來證明。比如我們有個基類 public class a 它有乙個私有成員name,和乙個保護的方法getname 然後我們寫個空類來繼承他 public class b a 好了,如果我們例項化這個類,並呼叫getname方法,並輸出...