6

我知道默認的構造函數不是繼承的,如n3337中所述。需要一個例子顯示默認的構造函數沒有繼承

而且這裏面就有一個例子:

struct B2 { 
    B2(int = 13, int = 42); 
}; 

struct D2 : B2 { 
    using B2::B2; 
}; 

有了相當不錯的解釋:

B2D2候選集繼承構造函數是

... 
—B2(int = 13, int = 42) 
—B2(int = 13) 
—B2() 

而且最重要的是:

集目前在D2構造函數是
—D2(),隱式聲明的默認構造函數,而不是繼承

對我來說,這個例子沒有顯示出差異,在一定意義上,即使這很構造函數是繼承的 - 它的行爲與隱式聲明的默認構造函數沒有區別。

我需要一個例子來說明可以輕鬆理解的方式,比如說,熟悉C++ 03但希望學習C++ 11的用戶。


[更新]
全部回答(包括我自己)是一種 「如果默認的C-TOR被繼承,則示例將編譯/不能編譯」。

我更喜歡結果(可觀察行爲)與其他情況不同的答案。

回答

2

考慮:

struct foo 
{ 
    foo() {} 
    foo(int) {} 
}; 

struct bar : foo 
{ 
    using foo::foo; 
}; 

int main() 
{ 
    bar b; 
} 

這編譯:由於bar沒有用戶聲明構造函數,默認的構造函數將被隱式聲明。

struct foo 
{ 
    foo() {} 
    foo(int) {} 
}; 

struct bar : foo 
{ 
    using foo::foo; 
    bar(double) {} 
}; 

int main() 
{ 
    bar b; 
} 

這不能編譯。默認的構造函數沒有繼承,並且沒有隱式聲明,因爲有構造函數bar(double)

+0

在提案看(例如,[N2203](http://www.open-std.org/JTC1/SC22/WG21/docs/papers /2007/n2203.html)),這似乎是(部分?)不繼承複製/移動和默認ctors的基本原理。 – dyp

3

一個可能的區別:多重構造函數從具有默認構造函數的類繼承。例如:

struct A { A(int=0); }; 
struct B { B(double=3.14); }; 
struct C : A, B { 
    using A::A; 
    using B::B; 
}; 

C c; 

如果默認構造函數被繼承,C將繼承一個來自AB,產生歧義。

我不能想到多構造函數繼承的用例,所以這可能不是您正在尋找的完美例子,但它是一些東西。

1

下面是示例,可以從遺傳構造的以下特徵來製造:

12.9繼承構造
[...]
4),以聲明的構造具有相同的訪問權限在十

相應的構造函數,因此我的建議是有保護的默認構造函數在基地:

class Base { 
protected: 
    Base(int) {} 
    Base() = default; 
}; 

如果此構造函數是派生的,則派生類無法實例化,因爲派生構造函數將具有受保護的訪問權限。如果沒有衍生 - 那麼默認的隱式聲明的構造具有公共訪問:

struct Derived : Base { 
    using Base::Base; 
}; 

int main() { 
    Derived d1{}; // not inherited, default constructor is public 
    Derived d2{1}; // not compiling since this c-tor is inherited, thus protected 
} 
相關問題