如果我們在定義class時沒有明確的給定constructor與destructor時,就會compiler就會自動幫你定義一個沒有功能的constructor與destructor。比如下面的例子:
Ex1 |
class Base class Derived: public Base // Derived的constructor沒有呼叫其parent的constructor ,但compiler會implicitly的呼叫Base(){}。而由於Base(){} 也已經被compiler implicitly的定義了,所以沒問題。 Derived(int y) { } |
但是如果我們已經明確地定義建構子(explicit constructor),則compiler就不會再次定義沒有功能的implicit constructor。比如下例:class Base已經有一個explicit constructor叫做 Base(int x) ,那麼沒有參數的constructor Base() 就不會被隱含地(implicitly )被宣告了。
Ex2 |
class Base class Derived: public Base // 如果child class的constructor 沒有explicit 的呼叫parent的constructor,則compiler則會implicitly去呼叫其parent的implicit constructor,也就是沒有參數的constructor Base()。但是這個情況,Base()不會被宣告,所以會出現:「'Base' : 沒有適當的預設建構函式」的錯誤。 Derived(int y) { |
解決方法之一:在child class的constructor去explicitly地呼叫parent已經定義好的constructor。
Ex3 |
class Base class Derived: public Base Derived(int y): Base(y) { |
解決方法之二:我們可以在parent class裡面explicitly去宣告一個沒有參數的constructor。
Ex4 |
class Base Base(int x) { // 已經有explicit constructor,則不會有implicit constructor Base(){ } // 因此我們主動宣告一個沒有參數的constructor }; class Derived: public Base Derived(int y): { // 這時候child 的constructor去implicitly的呼叫Base()就不會有錯誤了。 |
沒有留言:
張貼留言