顯式轉換與隱式轉換


下面哪種情況下,B不能隱式轉換為A?
class B:public A{}
class A:public B{}
class B{operator A();}
class A{A(const B&);}

顯式轉換是由程序員自己主動完成,隱式轉換是由編譯器完成的,其二顯示轉換一般是由高向低,隱式轉換是由低到高,其三顯式轉換的格式為類型(對象)或(類型)對象。

static_cast, dynamic_cast, const_cast探討

  • 用於類層次結構中基類和子類之間指針或引用的轉換。進行上行轉換(把子類的指針或引用轉換成基類表示)是安全的;進行下行轉換(把基類指針或引用轉換成子類指針或引用)時,由於沒有動態類型檢查,所以是不安全的。



public之后的是基類,A中A是基類,B是派生類,B轉A的時候會產生切片問題,是可行的;


表示A是基類,B是派生類,向上級類型轉換是隱式的因為部分元素丟棄可以自動完成,向下轉型是顯式的因為不知道應該增加的值是什么。所以B不能。
答案C,Operator除了表示函數重載操作符,還可以表示B類型可以裝換為A類型。
B中B是基類,A是派生類,因為A中有B中不存在的部分,隱式轉換會發生問題,可以采用強制類型轉換dynamic_cast<A> b;
C不太清楚,但可以肯定B錯
D是復制構造函數,楚翔a=b;的時候可以調用,故可以隱式轉換;
 
 
 1 #include<iostream>
 2 using namespace std;
 3 class B0//基類BO聲明
 4 {
 5 public://外部接口
 6     virtual void display()//虛成員函數
 7     {
 8         cout<<"B0::display0"<<endl;}
 9 };
10 class B1:public B0//公有派生
11 {
12 public:
13     void display() { cout<<"B1::display0"<<endl; }
14 };
15 class D1: public B1//公有派生
16 {
17 public:
18     void display(){ cout<<"D1::display0"<<endl; }
19 };
20 void fun(B0 ptr)//普通函數
21 {
22     ptr.display();
23 }
24 int main()//主函數
25 {
26     B0 b0;//聲明基類對象和指針
27     B1 b1;//聲明派生類對象
28     D1 d1;//聲明派生類對象
29     fun(b0);//調用基類B0函數成員
30     fun(b1);//調用派生類B1函數成員,子類向上隱式類型轉換為父類
31     fun(d1);//調用派生類D1函數成員,子類向上隱式類型轉換為父類
32 }

 

正確答案: A 

B0::display() B0::display() B0::display()
B0::display() B0::display() D1::display()
B0::display() B1::display() D1::display()B0::display() B1::display() B1::display(
虛函數的動態綁定僅在 基類指針或引用綁定派生類對象時發生  ,fun的形參不是指針,所以調用哪個版本的函數編譯時就已經確定,
根據形參靜態類型確定調用B0的成員。

此題的關鍵點在於fun函數,傳入的參數是一個類的對象,這樣,派生類作為參數傳入的時候,會自動的類型轉換為基類對象,
這樣,display就只是執行基類的函數了。選B0::display() B0::display() B0::display()






免責聲明!

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



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