下面哪種情況下,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()