अगर मैं इस तरह एक कोड है पर अधिभार:सी ++ सदस्य समारोह आभासी ओवरराइड और एक ही समय
struct A {
virtual void f(int) {}
virtual void f(void*) {}
};
struct B : public A {
void f(int) {}
};
struct C : public B {
void f(void*) {}
};
int main() {
C c;
c.f(1);
return 0;
}
मैं एक त्रुटि है कि का कहना है कि मैं शून्य करने के लिए पूर्णांक से अवैध रूपांतरण करने के लिए कोशिश कर रहा हूँ * मिलता है। कंपाइलर क्यों नहीं समझ सकता कि उसे बी :: एफ को कॉल करना है, क्योंकि दोनों कार्यों को वर्चुअल के रूप में घोषित किया गया है?
आधा जवाब पढ़ने के बाद मैं गया और इसे और भी कम कर दिया। यह भी काम नहीं करता है। बहुत सहज नहीं है।
struct A {
virtual void f(int) {}
};
struct B : public A {
void f(void*) {}
};
int main() {
B b;
b.f(1);
return 0;
}
सकता समारोह छिपने पर सी ++ पूछे जाने वाले प्रश्न के लिए एक लिंक जोड़ना चाहते हैं: http://www.parashift.com/c++-faq-lite/strange- inheritance.html # faq-23.9 – greyfade
@jalf: ऐसे कंपाइलर के व्यवहार का कारण क्या है? कॉल फिट करने के लिए फ़ंक्शंस के लिए बेस क्लास क्यों न खोजें? – Andrew
* * * का कारण क्या होगा? कंपाइलर को कुछ व्यवहार चुनना पड़ता है, और यह कुछ मामलों में समझ में आता है, और दूसरों में बेतुका लगता है। इस योजना का लाभ यह है कि आप "खोज जारी रखें" व्यवहार में ऑप्ट-इन कर सकते हैं। लेकिन अगर ऐसा होता तो इसका चयन करने और * यह * व्यवहार प्राप्त करने का कोई तरीका नहीं होगा। दिन के अंत में, भाषा डिजाइनरों को निर्णय लेना पड़ा, और उन्होंने इस व्यवहार को उठाया। :) – jalf