2017-02-09 56 views
1

mother對象如何在調用類型爲son時能夠調用father的函數?帶多重繼承的C++類型轉換

這裏的father對象沒有創建,那麼如何來調用drive()函數。對於新手的問題抱歉。

#include <iostream> 
using namespace std; 

#include <iostream> 
using namespace std; 
class father 
{ 
    public: 
    void drive(){cout<<"Driving";} 
}; 
class mother 
{ 
    public: 
    void cook(){cout<<"Cooking";} 
}; 
class son: public father, public mother 
{ 

}; 
int main() { 
    // your code goes here 
    mother *m = new mother(); 
    son* s = static_cast<son *>(m); 
    s->drive(); 
    return 0; 
} 
+2

使用舊stlye強制轉讓給你沒有辦法驗證你得到 – doctorlove

+1

這是非法的。它可能會出現**工作,但它不會。 – BoBTFish

+1

@Coder'(son *)'強制編譯器接受它自己不會「推斷」的內容。 – Scheff

回答

2

解引用son*類型的指針時,它不指向類型的對象或從son(即,尖銳的物體具有不兼容的類型)衍生的有未定義的行爲。

爲什麼母親對象可以...

行爲是不確定的。

3

您的代碼具有未定義的行爲,因爲您嘗試通過類型son訪問類型爲mother的對象,該對象不是該對象的動態類型。

更精確地,[basic.lval]在標準表示:

如果一個程序試圖通過的其他一個glvalue比以下類型的行爲是未定義的一個訪問對象的存儲值:

  • 動態類型的對象,
  • 動態類型的對象的CV-合格版本,
  • 類型類似於動態類型的對象,
  • 一種類型,是有符號或對應的動態對象的類型無符號類型,
  • 在所述簽名或對應於無符號CV-類型的類型該對象的動態類型的合格版本,
  • 聚合或聯合類型,其中包括上述類型之一的元素或非靜態數據成員(包括遞歸,元素或非靜態數據成員的子集或包含的聯合),
  • 一種類型,它是該對象的動態類型的(可能是CV-合格的)基類類型,
  • char或unsigned char類型。

報價cppreference.com

未定義行爲 - 有對程序的行爲沒有任何限制。未定義行爲的例子是數組邊界之外的內存訪問,有符號整數溢出,空指針取消引用,在沒有序列點的表達式中多次修改相同標量,通過不同類型的指針訪問對象等。編譯器不需要診斷未定義的行爲(雖然診斷了許多簡單情況),編譯後的程序不需要做任何有意義的事情。