寒武紀C++日常實習生面經(其他人面試題)


1.C++繼承方式?

答:public,protected,private三種繼承方式和虛繼承一共四種。

派生類可以繼承定義在基類中的成員,但是派生類的成員函數不一定有權訪問從基類繼承而來的成員。 
派生類將除了基類的構造函數和析構函數以外的所有成員都繼承下來了。 

 

虛繼承:

虛擬繼承是多重繼承中特有的概念。虛擬基類是為解決多重繼承(菱形繼承)而出現的。如:類D繼承自類B1、B2,而類B1、B2都繼承自類A,因此在類D中兩次出現類A中的變量和函數。為了節省內存空間,可以將B1、B2對A的繼承定義為虛擬繼承,而A就成了虛擬基類。實現的代碼如下:

class A

class B1:public virtual A;

class B2:public virtual A;

class D:public B1,public B2;

虛擬繼承在一般的應用中很少用到,所以也往往被忽視,這也主要是因為在C++中,多重繼承是不推薦的,也並不常用,而一旦離開了多重繼承,虛擬繼承就完全失去了存在的必要因為這樣只會降低效率和占用更多的空間。

2.B C虛繼承A,D public繼承 B C ,有A *a = new D,a->fun(),fun是虛函數,並且B C都重寫了,怎么保證a調用的是B重寫的虛函數。

// B C虛繼承A,D public繼承 B C ,有A *a = new D,a->fun(),fun是虛函數, // 並且B C都重寫了,怎么保證a調用的是B重寫的虛函數 
#include <iostream>
using namespace std; class A { public: virtual void fun() { cout << "A::fun()." << endl; } }; class B :public virtual A { public: void fun() { cout << "B::fun()." << endl; } }; class C :public virtual A { public: void fun() { cout << "C::fun()." << endl; } }; class D :public B, public C { public: void fun() { cout << "D::fun()." << endl; } }; int main() { A* a = new D; A* b = new B; a = b; a->fun(); return 0; } // 輸出:B::fun().

3.說說多態  靜態+動態

答:
總結:
1 在編譯過程中聯編的被稱為靜態聯編(static binding),又稱為早期聯編。
2 在運行時選擇正確的虛方法,這被稱為動態聯編,又稱為晚期聯編。
3 編譯器對非虛方法使用靜態聯編,編譯器對虛方法使用動態聯編。
 
靜態多態和動態多態的區別其實用下面的圖就可以體現

靜態多態(靜態聯編)

靜態多態也稱為靜態綁定或早綁。編譯器在編譯期間完成的, 編譯器根據函數實參的類型(可能會進行隱式類型轉換) , 可推斷出要調用那個函數, 如果有對應的函數就調用該函數, 否則出現編譯錯誤。

int Add(int left,int right) { return left + right; } float Add(float left, float right) { return left + right; } int main() { cout<<Add(1,2)<<endl;  //調用int Add()函數
    cout<<Add(1.34f,3.21f)<<endl; //調float Add()函數
    return 0; }

動態多態(動態聯編)

動態綁定: 在程序執行期間(非編譯期) 判斷所引 用對象的實際類型, 根據其實際類型調用相應的方法。使用virtual關鍵字修飾類的成員 函數時, 指明該函數為虛函數, 派生類需要重新實現, 編譯器將實現動態綁定。

額外問題:為什么有兩種類型的聯編以及為什么默認為靜態聯編?

答:如果動態聯編讓您能夠重新定義類方法,而靜態聯編在這方面很差,為何不摒棄靜態聯編呢?原因有兩個----效率和概念模型。

1 首先來看效率。為使程序能夠在運行階段進行決策,必須采取一些方法來跟蹤基類指針或引用指向的對象類型,這增加了額外的處理開銷,例如,如果類不會用作基類,則不需要動態聯編。同樣,如果派生類不重新定義基類的任何方法,也不需要使用動態聯編。在這些情況下,使用靜態聯編更合理,效率也更高。由於靜態聯編的效率更高,因此被設置為C++的默認選擇。Strousstrup說,C++的指導原則之一是,不要為不使用的特性付出代價(內存或處理時間)。僅當程序設計確實需要虛函數時,才使用它們。

2 接下來看概念模型.在設計類時,可能包含一些不在派生類重新定義的成員函數.不將訪函數設置為虛函數有兩方面好處:首先效率高;其次,指出不要重新定義該函數.這表明,僅將那些預期將被重新定義的方法聲明為虛擬的。

4.說說引用,什么時候用引用好,什么時候用指針好?

答:

使用引用參數的主要原因有兩個:

  • 程序員能修改調用函數中的數據對象
  • 通過傳遞引用而不是整個數據–對象,可以提高程序的運行速度

一般的原則:
對於使用引用的值而不做修改的函數:

  • 如果數據對象很小,如內置數據類型或者小型結構,則按照值傳遞
  • 如果數據對象是數組,則使用指針(唯一的選擇),並且指針聲明為指向const的指針
  • 如果數據對象是較大的結構,則使用const指針或者引用,已提高程序的效率。這樣可以節省結構所需的時間和空間
  • 如果數據對象是類對象,則使用const引用(傳遞類對象參數的標准方式是按照引用傳遞)

對於修改函數中數據的函數:

  • 如果數據是內置數據類型,則使用指針
  • 如果數據對象是數組,則只能使用指針
  • 如果數據對象是結構,則使用引用或者指針
  • 如果數據是類對象,則使用引用

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM