2017-04-26 17 views
5

मैंने बेस क्लास में शुद्ध वर्चुअल फ़ंक्शन लिखने की कोशिश की, और मैं इसे परिभाषा परिभाषा के पास देता हूं जैसा कि कोड कोड में दिखाया गया है, क्योंकि मुझे पता है कि मुझे संकलन त्रुटि मिलनी चाहिए, लेकिन सब ठीक काम किया। क्या यह कुछ नया है जो सी ++ 17 के साथ आता है?सी ++ 17 में शुद्ध वर्चुअल फ़ंक्शन के लिए बॉडी?

class Base { 
public: 
virtual void virtual_func() { std::cout << "This a virtual function from BASE" << std::endl; }; 
virtual void pure_func() = 0 { std::cout << "This a PURE virtual function from BASE" << std::endl; }; 
}; 

धन्यवाद

+0

है "मुझे पता है मैं एक संकलन त्रुटि मिलती है चाहिए" - क्यों? शुद्ध आभासी कार्यों को लागू करने के लिए यह पूरी तरह कानूनी है। –

+2

मानक इसकी अनुमति नहीं देता है, लेकिन वीएस (या अधिक सटीक रूप से, माइक्रोसॉफ्ट का कंपाइलर) करता है। अनुरूप होने के लिए, आपको घोषणा से परिभाषा को अलग करने की आवश्यकता है। –

+0

@ नील बटरवर्थ मुझे ऐसा नहीं लगता है। यह सी ++ 14 पर संकलित नहीं हो सकता है। http://ideone.com/EISKsp – javaLover

उत्तर

4

शुद्ध आभासी एक परिभाषा के साथ एक साथ नहीं किया जा सकता (मैं दृश्य स्टूडियो 2017 प्रयुक्त)। यह सी ++ 11 में सच था, और सी ++ 14 में:

10,4/2: ...
[ध्यान दें: एक समारोह घोषणा दोनों एक शुद्ध-विनिर्देशक और एक परिभाषा प्रदान नहीं कर सकते - अंत टिप्पणी] [उदाहरण:

struct C { 
virtual void f() = 0 { }; // ill-formed 
}; 

एक ही बयान (खंड 13.4/2 इस समय के तहत) के लिए सी ++ 17 (N4659) अभी भी सच है।

तो अपने संकलक इस कोड को स्वीकार करते हैं, यह निश्चित रूप से एक बग (gcc 7.1 doesesn't)

+0

हाँ, आप पुराने हाथ हैं, AFAIR। +1 – snr

+1

एफवाईआई, मैंने माइक्रोसॉफ्ट को यह बग रिपोर्ट किया: https://developercommunity.visualstudio.com/content/problem/187888/msvc-incorrectly-allows-pure-virtual-function-defi.html –

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