2014-03-01 71 views
1

我有一個由2個子類繼承的基類。這個子類也繼承了構造函數。但是如果我嘗試用類B的副本構造類A的實例,它將不起作用(編譯錯誤)。用繼承構造函數初始化姐妹類

class base { 
    int a_; 
public: 
    base(int x) 
    : a_(x) {} 

    base(base const& cpy) 
    : a_(cpy.a_) {} 
}; 

class A : public base { 
public: 
    using base::base; 
}; 

class B : public base { 
public: 
    using base::base; 
}; 

int main() { 
    A a(123); 
    B b(a); 

    return 0; 
} 

正如你所看到的here

但是,如果我插入一個構造函數與基作爲參數類它的工作原理:

class A : public base { 
public: 
    using base::base; 

    A(base const& cpy) 
    : base(cpy) {} 
}; 

這不是插入一個構造基本問題。我的問題是爲什麼繼承的構造函數無法正常工作。

+0

是的,我刪除了我的評論,因爲它引起了我的注意,它「爲我工作」的唯一原因是由於MVP。 – Borgleader

回答

3

複製構造函數(和移動和默認值)被明確排除在繼承之外。我認爲他們想避免暗示你展示的那種反向切片行爲,雖然在很多情況下這不是問題。

N3797§12.9/ 2:

對於在候選集合中比沒有參數或具有單個參數複製/移動的構造構造其他遺傳構造的每個非模板的構造,構造是隱含地聲明具有相同的構造函數特徵,除非...

+0

我認爲,這是我正在尋找的:) – user1810087

0

如果基類已經在任何地方進行了深度複製,它將期望來自繼承類的相同。但是,如果我們開始執行默認拷貝策略,那麼編譯器將無法「自動化」它,因爲您需要在它的所有類中編寫特殊代碼。

你的例子相當簡單,但如果你在派生類中有多個指針和變量,將會很困難。 也許這就是爲什麼它在開始時從未被允許。

+0

複製構造函數是隱式定義的。這裏的問題是「複製」對象只是一個基礎。派生類中的變量將被默認初始化,除非爲它們指定了初始化函數,這始終是繼承構造函數時發生的情況。 – Potatoswatter