कोडिंग की मेरी शैली में निम्नलिखित मुहावरे शामिल हैं:
class Derived : public Base
{
public :
typedef Base super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
यह मुझे "सुपर" को बेस के लिए एक उपनाम के रूप में उपयोग करने में सक्षम बनाता है, उदाहरण के लिए, निर्माणकर्ताओं में:
Derived(int i, int j)
: super(i), J(j)
{
}
या तब भी जब इसके अधिरोहित संस्करण के अंदर बेस क्लास से विधि को कॉल किया जाता है:
void Derived::foo()
{
super::foo() ;
// ... And then, do something else
}
यह भी जंजीर हो सकता है (मैं अभी भी उस के लिए उपयोग खोजने के लिए है, हालांकि):
class DerivedDerived : public Derived
{
public :
typedef Derived super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
void DerivedDerived::bar()
{
super::bar() ; // will call Derived::bar
super::super::bar ; // will call Base::bar
// ... And then, do something else
}
वैसे भी, मुझे "टाइपफेड सुपर" का उपयोग बहुत उपयोगी लगता है, उदाहरण के लिए, जब बेस या तो क्रिया है और / या अस्थायी है।
तथ्य यह है कि सुपर को जावा में लागू किया गया है, साथ ही साथ सी # (जहां इसे "आधार" कहा जाता है, जब तक कि मैं गलत नहीं हूं)। लेकिन C ++ में इस कीवर्ड का अभाव है।
तो, मेरे सवाल:
- क्या यह आपके द्वारा काम किए गए कोड में टाइप किए गए सुपर आम / दुर्लभ / कभी नहीं देखा गया है?
- क्या यह टाइपडिफ सुपर ओके का उपयोग है (अर्थात क्या आप इसका उपयोग नहीं करने के लिए मजबूत या इतने मजबूत कारण देखते हैं)?
- "सुपर" एक अच्छी बात होनी चाहिए, क्या इसे सी ++ में कुछ हद तक मानकीकृत किया जाना चाहिए, या क्या यह पहले से ही एक टाइपराइफ के माध्यम से उपयोग किया जाता है?
संपादित करें: रॉडी ने इस तथ्य का उल्लेख किया कि टाइपडेफ निजी होना चाहिए। इसका मतलब यह है कि कोई भी व्युत्पन्न वर्ग इसे पुन: घोषित किए बिना इसका उपयोग करने में सक्षम नहीं होगा। लेकिन मुझे लगता है कि यह सुपर को भी रोक देगा: सुपर चेनिंग (लेकिन जो इसके लिए रो रहा है?)।
संपादित करें 2: अब, "सुपर" का बड़े पैमाने पर उपयोग करने के कुछ महीने बाद, मैं पूरी ईमानदारी से रोडी के दृष्टिकोण से सहमत हूं: "सुपर" निजी होना चाहिए। मैं उनके उत्तर को दो बार बढ़ाऊंगा, लेकिन मुझे लगता है कि मैं नहीं कर सकता।
super
जैसा दिखता है Java
और यह कुछ भी बुरा नहीं है, लेकिन ... लेकिन C++
कई विरासत का समर्थन करता है।
MyFirstBase<MyString, MyStruct<MyData, MyValue>>
template <class baz> struct Foo {...void bar() {...} ...}; struct Foo2: Foo<AnnoyinglyLongListOfArguments> { void bar2() { ... Foo::bar(); ...} };
इसने मेरे साथ gcc 9.1 --std = c ++ 1y (c ++ 14) काम किया।