2016-07-28 6 views
10

इस कोड को वास्तव में काम करता है:कक्षा में पुराने और नए सी ++ फ़ंक्शन सिंटैक्स को मिश्रित कर रहा है?

class Abstract { 
    virtual auto foo() -> int = 0; 
}; 

class Concrete: public Abstract { 
    int foo() { cout << "blah!" << endl; return 1; } 
} instance; 

मैं समझता हूँ कि समारोह घायल और एक ही समारोह हस्ताक्षर होने के लिए लिंक होता है, लेकिन सी ++ 14 में वास्तव में कानूनी मिश्रण इस तरह का है?

+4

मुझे लगता है कि 'कंक्रीट' को 'सार' से प्राप्त किया जाना चाहिए? (पीएस: यदि आप यह सुनिश्चित करना चाहते हैं कि यह वास्तव में बेस फ़ंक्शन को ओवरराइड कर रहा है, तो ओवरराइड कीवर्ड का उपयोग करें। यदि यह संकलित करने में विफल रहता है तो आपको पता है कि वे मेल नहीं खाते हैं।) – Borgleader

+1

चूंकि सी ++ पीछे की तरफ संगत है, यह नहीं होना चाहिए एक समस्या, अगर यह चाहता है कि एक और सवाल है (स्टाइल गाइड) – deW1

+0

@ डीडब्ल्यू 1 * आम तौर पर */* अधिकतर * पिछड़ा संगत अधिक सटीक होगा ;-) –

उत्तर

7

auto foo()->int और int foo() विभिन्न वाक्यविन्यास के साथ व्यक्त एक ही प्रोटोटाइप हैं, इसलिए दूसरा फ़ंक्शन पहले का ओवरराइड है, और इसे आमतौर पर रनटाइम प्रेषण (आभासी होने) में प्रतिस्थापित करेगा।

दाईं ओर वापसी वाक्य रचना, जैसे

template<class A, class B> 
auto some_combination(A a, B b) -> decltype(a+b); 

अन्यथा तरह

a के बाद से

और b एक अधिक जटिल वाक्य रचना की आवश्यकता होती है, आम तौर पर एक और उद्देश्य है बाईं में परिभाषित नहीं कर रहे हैं प्रोटोटाइप के पक्ष में।

जब वापसी का प्रकार छोटा रूप से परिभाषित किया जाता है, तो बाएं या दाएं प्लेसमेंट अनिवार्य रूप से अप्रासंगिक है।

2

यह कानूनी है क्योंकि वास्तव में आप अपने कार्य को पूरी तरह से परिभाषित कर रहे हैं।
एक न्यूनतम, काम उदाहरण (ध्यान दें override) के रूप में:

class Abstract { 
    virtual auto foo() -> int = 0; 
}; 

class Concrete: public Abstract { 
    int foo() override { return 1; } 
} instance; 

int main() { } 

यहाँ वापसी प्रकार निष्कर्ष निकाला नहीं है, यह स्पष्ट रूप से एक अनुगामी वापसी प्रकार के माध्यम से घोषित है। यदि आप इस का उपयोग कर रहे थे यह अलग हो गया होता

class Abstract { 
    virtual int foo() = 0; 
}; 

:
यह के बराबर है

class Abstract { 
    virtual auto foo() = 0; 
}; 

यहाँ टेम्पलेट कटौती शामिल है और आभासी कार्यों वापसी प्रकार निष्कर्ष निकाला है नहीं कर सकते हैं (जो अधिक है या जीसीसी से त्रुटि स्ट्रिंग कम)।

+0

मूल कार्य शुद्ध वर्चुअल होने पर मुझे ओवरराइड का उपयोग करने की आवश्यकता क्यों होगी? – Philipp

+2

@ फिलिप ओवरराइड पाठक को स्पष्ट रूप से कहता है कि डेवलपर का इरादा क्या है। इसके अलावा, यदि बेस क्लास में ऐसा वर्चुअल फ़ंक्शन नहीं है तो इसका संकलन त्रुटि हो जाएगी। क्यों नहीं? – skypjack

संबंधित मुद्दे