2017-05-03 45 views
2

我不明白如何定義下面的Animal(Animal*)構造函數。代碼編譯並正確運行。這個指針構造函數是如何定義的?

class Animal { 
public: 
    virtual ~Animal() {} 
    virtual std::string specie() = 0; 
    virtual std::string family() = 0; 
}; 

class Rodent : public Animal { 
public: 
    std::string family() override { return "rodent"; } 
}; 

class Rabbit : public Rodent { 
public: 
    std::string specie() override { return "rabbit"; } 
}; 

int main() { 
    Animal* goffy(new Rabbit()); 
} 

new Rabbit()回報Rabbit*其通過繼承Animal*這樣的構造正在指向自己的指針?

+0

您可能需要仔細檢查您的發佈代碼。鹿從未被定義;因此,我在主函數中出現編譯器錯誤。 – mgarey

+0

請顯示Deer :: Deer() –

+0

的定義修正了錯字,謝謝 – clicky

回答

4

您正在執行direct initialisation

表達式new Rabbit()將返回Rabbit*。然後將Rabbit*值轉換爲Animal*值,這可能是因爲AnimalRabbit的基類。 Animal*值然後被分配到goffy變量中。

+1

複製初始化在哪裏?我只看到代碼中的直接初始化。 –

+0

@CharlesBailey修復。 – InternetAussie

1

由於goffy是一個指針,它是完全一樣的

Animal* goffy = new Rabbit(); 
+0

所以這只是語法糖? – clicky

+0

我不會稱之爲「糖」,它只是語法上的規律性。 – molbdnilo

+1

沒有'='的表單通常是首選的,因爲(在C++ 17之前),它沒有在與類類型一起使用時指定不必要的中間對象 –

0

指向對象的指針可以像使用堆棧上的常用對象一樣使用複製構造函數進行復制。 但是,有幾件事情發生在這裏:

  • 首先一個Deer對象上堆返回一個指向其ADRESS創建
  • Animal對象是使用由 編譯器默認提供的拷貝構造函數創建,而不是創建一個精確的副本, Deer對象正在切片,因爲Animal是它的基類。