मेरे पास एकाधिक माता-पिता के साथ सी ++ कक्षा है; हर माता-पिता एक आम नाम है लेकिन एक अलग उद्देश्य के साथ एक समारोह को परिभाषित करता है:योग्य वर्चुअल तरीके ओवरराइडिंग
class BaseA
{
virtual void myFunc(); // does some task
};
class BaseB
{
virtual void myFunc(); // does some other task
};
class Derived : public BaseA, public BaseB;
तो यह है कि यह किया गया था, मुझे कोई समस्या नहीं होता - मैं अस्पष्टता यह एक कथन का उपयोग के साथ हल कर सकता है, और मैं चुन सकते हैं जो बेस क्लास नाम और स्कोप रिज़ॉल्यूशन ऑपरेटर का उपयोग करके कॉल करने के लिए एक।
दुर्भाग्य से, व्युत्पन्न वर्ग उन्हें ओवरराइड करने की जरूरत है दोनों:
class Derived : public BaseA, public BaseB
{
virtual void BaseA::myFunc(); // Derived needs to change the way both tasks are done
virtual void BaseB::myFunc();
}
यह काम नहीं करता है, इसलिए नहीं कि यह एक नया अस्पष्टता का परिचय (हालांकि यह हो सकता है), लेकिन क्योंकि
" त्रुटि C3240: 'myFunc': 'बेसए' 'का एक गैर-अधिभारित अमूर्त सदस्य फ़ंक्शन होना चाहिए "
" त्रुटि C2838: सदस्य घोषणा में अवैध योग्य नाम "
विभिन्न परिस्थितियों में मैं केवल विधियों का नाम बदल सकता हूं, या संकलक के सुझाव के रूप में उन्हें शुद्ध आभासी बना सकता हूं। हालांकि, वर्ग पदानुक्रम संरचना और कई बाहरी मुद्दों ने पहला विकल्प अत्यंत कठिन बना दिया है, और दूसरा असंभव है।
क्या किसी के पास कोई सुझाव है? क्वालीफायर केवल शुद्ध आभासी तरीकों के लिए क्यों अनुमति दी जाती है? वर्चुअल विधियों को एक साथ ओवरराइड करने और अस्पष्टताओं को हल करने का कोई तरीका है?
आप अलग-अलग वर्गों में व्यवहार को ओवरराइड भी कर सकते हैं: 'DerivedA: Public BaseA',' DerivedB: Public BaseB', और फिर 'व्युत्पन्न: सार्वजनिक DerivedA, सार्वजनिक DerivedB'। यह अस्पष्टता समस्या को हल नहीं करता है, हालांकि – Cameron