我一直在嘗試理解C++中的類型轉換。在下面的代碼中,類B是類A的子類,它們都共享多態關係。上述程序的理解C風格類型轉換和動態轉換的困難
#include <iostream>
using namespace std;
class A{
int a;
public:
virtual void sayhello() {cout<<"Hello from A"<<endl;}
};
class B:public A{
int b;
public:
void sayhello(){cout<<"Hello from B"<<endl;}
void another_func(){cout<<"Hello from B::another_func"<<endl;}
};
int main() {
A *temp1 = new A;
//Statement 1
B *b =(B*) temp1;
//Statement 2
//B* b = dynamic_cast<B*>(temp1);
b->another_func();
delete temp1;
return 0;
}
輸出 -
Hello from B::another_func
我有困難的理解下面的問題 -
1)聲明1,我們如何可以投父對象到子object.Logically這應該不正確,因爲現在我們已經擴大了此對象的功能(同一對象現在可以訪問子類功能another_func)。
Java中的類似的代碼產生無錯誤
「不兼容的類型:A不能被轉換到B
B B =(A)溫度;」
現在,如果我們註釋語句1個&取消註釋語句2類似的事情發生了聲明2.
那麼,爲什麼C++允許嗎? 2)現在,如果我們從兩個類中移除sayhello()函數,使它們沒有多態關係,那麼dynamic_cast的語句2不再起作用(因爲我們知道dynamic_cast可以壓倒多態類),但是c樣式轉換語句1仍然產生相同的輸出。
所以我們可以說C風格的演員並不是基於類之間的多態關係。
什麼是基於C風格轉換髮生的參數?
你的程序調用未定義的行爲。幾乎可以發生任何事情;標準的誇張是[電腦允許惡魔飛出你的鼻子](http://www.catb.org/jargon/html/N/nasal-demons.html)。 – user2357112