मैं तृतीय पक्ष लाइब्रेरी द्वारा प्रदान की गई कक्षा का विस्तार कर रहा हूं। कक्षा, चलो इसे Foo
पर कॉल करें, reset()
विधि है जिसे Foo
के व्यवहार को पुनरारंभ करने के लिए कहा जा सकता है। reset()
विधि कक्षा द्वारा आंतरिक रूप से भी उपयोग की जाती है। , दुर्भाग्य सेतृतीय पक्ष विधियों को लागू करें वर्चुअल
class Bar : public Foo
{
public:
void reset() {
/* ...something... */
Foo::reset();
}
};
के बाद से Foo::reset()
विधि, आभासी नहीं है Bar::something()
फोन करके मुझे मिलता है:
class Foo
{
public:
void reset() {
/* ... */
}
void something() {
reset();
}
};
अब तक, मैं क्रम में reset()
विधि ओवरलोड मेरी अतिरिक्त सुविधाओं को रीसेट करने के रूप में अच्छी तरह की जरूरत है Foo::reset()
विधि Bar::reset()
के बजाय बुलाया गया।
क्या कोई तरीका है (Foo::something()
ओवरलोडिंग से अलग) इसे पिछड़ा वर्चुअल बनाने के लिए?
वैसे, इस तरह से मैंने हमेशा वर्चुअल के रूप में सेट करना सीखा जो कि दोनों सार्वजनिक और आंतरिक रूप से उपयोग किया जाता है। – Dacav
यह एक बुरा निर्णय है, एनवीआई के लिए Google और आप सार्वजनिक आभासी तरीकों से बचने के लिए एक प्रवृत्ति देखेंगे। जिस समस्या का आप सामना कर रहे हैं वह अलग है: आप उस वर्ग को विस्तारित नहीं कर सकते जिसे विस्तारित करने के लिए डिज़ाइन नहीं किया गया था। –
मैं दृढ़ता से गैर वर्चुअल इंटरफेस का समर्थन करता हूं। 'वर्चुअल' सार्वजनिक विधियों का उपयोग करना आपके आंतरिक में हैंडल लौटने जैसा है -> यह नो-नो है। –