के बिना पॉलिमॉर्फिक फ़ंक्शन कॉल मान लीजिए कि पदानुक्रम के सभी वर्ग टेम्पलेट सदस्य फ़ंक्शन g
लागू करते हैं। कैसे मैं डुप्लिकेट कोड से छुटकारा और अभी भी प्राप्त कर सकते हैंडुप्लिकेट कोड
struct A {
virtual void f1() {
g(5);
}
virtual void f2() {
g(5.5);
}
private:
template <typename T> void g(T) {std::cout << "In A" << std::endl;}
};
struct B: A {
// Can I get rid of this duplicate code?
virtual void f1() {
g(5);
}
virtual void f2() {
g(5.5);
}
private:
template <typename T> void g(T) {std::cout << "In B" << std::endl;}
};
struct C: A {
// Can I get rid of this duplicate code?
virtual void f1() {
g(5);
}
virtual void f2() {
g(5.5);
}
private:
template <typename T> void g(T) {std::cout << "In C" << std::endl;}
};
int main()
{
B b;
A &a = b;
a.f1();
return 0;
}
f1
और f2
के कार्यान्वयन के बाद से सभी वर्गों में समान हैं,: सभी वर्गों दो अन्य कार्यों f1
और f2
कि इस टेम्पलेट फोन का एक ही कार्यान्वयन का हिस्सा main
में पॉलिमॉर्फिक कॉल अपेक्षित काम करता है (यानी आउटपुट "बी में" उत्पादन)?
मैंने इसे दूसरे तरीके से देखो: उन सभी को फोन 'इस-> जी', जहां '* this'' A' के गतिशील प्रकार है। यह देखने का गलत तरीका क्यों है? –
AlwaysLearning
@ हमेशा के लिए सीखना क्योंकि 'जी' वर्चुअल (और नहीं हो सकता) वर्चुअल है, जिसका अर्थ यह है कि सामान्य संकलन-समय नियम लागू होते हैं। ध्यान दें कि संकलन-समय नियम C++ में डिफ़ॉल्ट हैं। इसमें केवल कुछ चुनिंदा अपवाद हैं ('वर्चुअल', 'गतिशील_कास्ट',' टाइपिड')। – Angew
दाएं। लेकिन 'एफ 1' वर्चुअल है। 'F1' के भीतर' this' का प्रकार 'ए' का गतिशील प्रकार है। मैं चाहता हूं कि व्युत्पन्न कक्षा में कार्यान्वयन को दोहराने के बिना व्युत्पन्न कक्षा में 'f1' का समान समान कार्यान्वयन हो ... – AlwaysLearning