繼承 多型 組合

2021-08-02 00:00:45 字數 4553 閱讀 1069

1. 關於函式模板,描述錯誤的是? 

正確答案

: a   

你的答案

: c (錯誤

) a.  

函式模板必須由程式設計師例項化為可執行的函式模板

b.  

函式模板的例項化由編譯器實現

c.  

乙個類定義中,只要有乙個函式模板,則這個類是類模板

d.  

類模板的成員函式都是函式模板,類模板例項化後,成員函式也隨之例項化

解析:函式模板必須由

編譯器根據

程式設計師的呼叫型別

例項化為可執行的函式。

2. 假設在乙個

32 位

little endian

的機器上執行下面的程式,結果是多少?

#include

int main()

正確答案

: b  

你的答案

: a (錯誤

) a.  

1,2,3

b.  

1,0,2

c.  

1,3,2

d.  

3,2,1

解析:

是乙個庫函式,c,

c++中函式的引數是從右往左入棧的; 2

棧的生長方向是從高往低的 3

小端模式是低位儲存在低位元組

4 %d

格式輸出的是

4個位元組大小,而

long long為8

個位元組

所以,a=1,b=0,c=2

3.   

所謂私有成員是指只有類中所提供的成員函式才能直接使用它們,任何類以外的函式對它們的訪問都是非法的。

a.   

b.   

解析:
設定友元函式,可以允許外面的類或函式去訪問類的私有變數和保護變數,從而使兩個類共享同一函式。

4.   

觀察下面一段**:

class classa

;

virtual void functiona(){};

};

class classb

;

};

class classc : public classa,public classb

;

classc aobject;

classa* pa=&aobject;

classb* pb=&aobject;

classc* pc=&aobject;

關於pa,pb,pc

的取值,

下面的描述中正確的是

:

a.   

pa,pb,pc

的取值相同

.

b.   

pc=pa+pb

c.   pa和

pb不相同

d.   

pc不等於

pa也不等於

pb

解析:
c

多重繼承自a和

b,a和

b兩個基類都有兩個虛函式表,其中按照繼承順序,

a的虛函式表排在

b的虛函式表前面,則選擇c。

aobject

的位址從

a的虛函式表開始,然後到

b的虛函式表,再到

c自身的成員。

在這個情況下,子類的指標和第乙個基類的指標應該是一樣的,和第二個基類是不一樣的。

5. 假設a為抽象類,下列宣告( )是正確的。

正確答案

: d   

你的答案

: b (錯誤

) int fun(a);

a.  

a obj;

b.  

a fun(int);

c.  

a *p;

解析:c++

中包含純虛函式的類稱為抽象類,由於抽象類中包含了沒有定義的純虛函式,所以不能定義抽象類的物件。

總結:1.抽象類只能用作其他類的基類,不能定義抽象類的物件。 2.

抽象類不能用於引數型別、函式返回值或顯示轉換的型別

3.抽象類可以定義抽象類的指標和引用,此指標可以指向它的派生類,進而實現多型性。

6.   

關於虛函式的描述正確的是()

正確答案

: b   

你的答案

: c (錯誤

) a.  

派生類的虛函式與基類的虛函式具有不同的引數個數和型別

b.  

內聯函式不能是虛函式

c.  

派生類必須重新定義基類的虛函式

d.  

虛函式可以是乙個

static

型的函式

解析:虛函式是為了實現動態繫結,不能宣告為虛函式的有: 1

、靜態成員函式;

2、類外的普通函式;

3、建構函式;

4、友元函式

此外,還有一些函式可以宣告為虛函式,但是沒有意義,但編譯器不會報錯,如: 1

、賦值運算子的過載成員函式:

因為複製操作符的過載函式往往要求形參與類本身的型別一致才能實現函式功能,故形參型別往往是基類的型別,因此即使宣告為虛函式,也把虛函式當普通基類普通函式使用。 2

、內聯函式:內聯函式目的是在**中直接展開(編譯期),而虛函式是為了繼承後能動態繫結執行自己的動作(動態繫結),因此本質是矛盾的,因此即使內聯函式宣告為虛函式,編譯器遇到這種情況是不會進行

inline

展開的,而是當作普通函式來處理。因此宣告了虛函式不能實現內斂的,即內斂函式可以宣告為虛函式,但是毫無了內聯的意義

7.   

下面有關繼承、多型、組合的描述,說法錯誤的是?

正確答案

: b d   

你的答案

: c d (錯誤

) a.  

封裝,把客觀事物封裝成抽象的類,並且類可以把自己的資料和方法只讓可信的類或者物件操作,對不可信的進行資訊隱藏

b.  

繼承可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件

c.  

隱藏是指派生類中的函式把基類中相同名字的函式遮蔽掉了

d.  

覆蓋是指不同的函式使用相同的函式名,但是函式的引數個數或型別不同

解析:過載:只有在

同一類定義中的同名成員函式才存在過載關係

,主要特點是

函式的引數型別和數目有所不同

,但不能出現函式引數的個數和型別均相同

,僅僅依靠返回值型別不同來區分的函式,這和普通函式的過載是完全一致的。另外,過載和成員函式是否是虛函式無關

覆蓋:派生類中覆蓋基類中的同名函式,要求兩個函式的引數個數、引數型別、返回型別都相同,且基類函式必須是虛函式。

隱藏:派生類中的函式遮蔽了基類中的同名函式, 2

個函式引數相同,但基類函式不是虛函式(和覆蓋的區別在於基類函式是否是虛函式)。

2個函式引數不同,無論基類函式是否是虛函式,基類函式都會被遮蔽(和過載的區別在於兩個函式不在同一類中)。

8.   

c++語言中,有關類的初始化敘述正確的是()

正確答案

: a d   

你的答案

: a b d (錯誤

) a. 

靜態函式中不能出現

this指標

b. 

可以在類定義時,對物件直接初始化

c. 

一般資料型別可以在類的外部進行初始化

d. 

靜態資料型別可以在類的外部進行初始化

解析: a

:靜態函式屬於類本身,不與類繫結,因此不能用

this

指標。a

選項正確。 b

:在類定義時,無法使用建構函式,因而無法完成物件的初始化 c

:一般成員變數需要在類內進行初始化 d

:靜態成員變數必須在類外初始化,靜態成員常量在類中初始化。

d選項正確。

知識點總結 組合,繼承,多型

一 組合 將乙個類的物件作為另乙個類的成員,被稱作組合或包含 1.將嵌入的物件作為新類的公有成員 class eye class nose class mouth class ear class head int main 2.將嵌入物件作為新類的私有成員 class engine void sta...

組合,菱形繼承問題,多型性,繼承的呼叫

一 組合 1,什麼是組合?組合就是乙個類的物件具備某乙個屬性,該屬性的值是指向另外乙個類的物件 2,為何用組合?組合也是用來解決類與類之間 冗餘問題的 3,使用組合 class course 定義課程了類 def init self,name,period,price self.name name ...

C 多型 繼承多型

什麼是多型?個人理解為 在程式語言繼承關係中,子類能替代父類,表現出不同的行為。換句話說 在繼承關係中,乙個類被例項化被其子類替代,子類中有父類的虛方法重寫,或者有父類同名方法 new 呼叫相同方法時候,將表現出子類或者父類中不同行為 老闆,上 static void main string arg...