6

मुझे पता है कि डिफ़ॉल्ट कन्स्ट्रक्टर विरासत में नहीं है, जैसा कि n3337 में बताया गया है।एक उदाहरण की आवश्यकता है कि डिफ़ॉल्ट कन्स्ट्रक्टर विरासत में नहीं मिला

और वहाँ वहाँ एक उदाहरण है:

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

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

काफी अच्छा विवरण के साथ:

उम्मीदवार B2 के लिए D2 में विरासत में मिला कंस्ट्रक्टर्स का सेट है

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

और सबसे महत्वपूर्ण:

D2 में मौजूद कंस्ट्रक्टर्स के सेट,
—D2(), परोक्ष-घोषित डिफ़ॉल्ट निर्माता,

विरासत में मिला नहीं मेरे लिए इस उदाहरण अंतर नहीं दिखाती है एक अर्थ में है कि भले ही यह बहुत ही कन्स्ट्रक्टर विरासत में मिला था - इसका व्यवहार निहित रूप से घोषित डिफ़ॉल्ट कन्स्ट्रक्टर से अलग नहीं था।

मुझे एक उदाहरण की आवश्यकता है जिस तरह से आसानी से समझ में आ सकता है, कहें, सी ++ 03 से परिचित दर्शक, लेकिन सी ++ 11 सीखना चाहते हैं।


[अद्यतन]
सभी उत्तर (मेरे अपने सहित) "यदि डिफ़ॉल्ट सी टो विरासत में मिला था तो उदाहरण के संकलन होगा/ संकलन नहीं" एक तरह से कर रहे हैं।

मैं उन उत्तरों को पसंद करूंगा जहां परिणाम (अवलोकन योग्य व्यवहार) अन्यथा अलग होगा।

उत्तर

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; 

, तो डिफ़ॉल्ट कंस्ट्रक्टर्स विरासत में मिला रहे थे, CA और B दोनों में से किसी एक के वारिस हैं, अस्पष्टता हो जाती है।

मैं एकाधिक-कन्स्ट्रक्टर-विरासत के लिए उपयोग के मामले के बारे में नहीं सोच सकता, इसलिए यह एक आदर्श उदाहरण नहीं हो सकता है जिसे आप ढूंढ रहे हैं, लेकिन यह कुछ है।

1

यहाँ उदाहरण के लिए, कि विरासत में मिला निर्माताओं की निम्नलिखित सुविधा से उत्पादन किया जा सकता है:

12,9 विरासत कंस्ट्रक्टर्स
[...]
4) एक निर्माता तो घोषित रूप में एक ही पहुँच गया है

: एक्स

में इसी निर्माता तो मेरे प्रस्ताव को आधार में डिफ़ॉल्ट निर्माता संरक्षित किया है

यदि यह निर्माता प्राप्त किया गया है, तो व्युत्पन्न वर्ग क्योंकि व्युत्पन्न निर्माता पहुँच संरक्षित है | instantiated नहीं किया जा सकता है। - अगर प्राप्त नहीं फिर डिफ़ॉल्ट परोक्ष घोषित निर्माता सार्वजनिक पहुंच है:

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 
} 
संबंधित मुद्दे