अधिक प्रभावी सी ++ में, एक दिलचस्प बिंदु लाया गया है कि मिश्रित सरणी और बहुरूपता एक बुरा विचार है।मिश्रित सरणी और बहुरूपता के लिए कंपाइलर चेतावनी
class Base {
public:
Base(int y) : a(y) {}
int a;
};
class D : public Base {
public:
D(int w, int y) : Base(y), c(w) {}
int c;
};
std::ostream& operator<<(std::ostream& os, const Base &obj)
{
os << obj.a << std::endl;
return os;
}
// This function will work perfectly well if i pass in a `Base` array,
// but if i pass in `D` array we are going to run into some problems.
// Namely that `arr[i+1] = &arr[i] + sizeof(Base)` will not progress
// the array correctly for a `D` array.
void printArray(const Base arr[]) {
for (int i = 0; i < 5; ++i) {
std::cout << arr[i];
}
}
int main() {
D arr[5] = { D(0, 10), D(1, 11), D(2, 12), D(3, 13), D(4, 14)};
printArray(arr); // This compiles without complaint! I understand that the
// conversion is legal, but it seems like a warning
// about this would be a good idea.
}
नोट:: उदाहरण के लिए मैं जानता हूँ कि यह बुरा डिजाइन है, लेकिन एक बिंदु को वर्णन करने के लिए है।
समस्या यहाँ है मैं ऊपर है जब रास्ते में इन दोनों के मिश्रण है कि, जब हम सरणी के माध्यम से पुनरावृति मुद्रित करने के लिए हम सही मात्रा द्वारा सरणी के तत्व प्रगति नहीं होगा (यानी हम sizeof(Base)
बजाय sizeof(D)
द्वारा ले जाने के)। यह उत्पादन में परिणाम है:
10
0
11
1
12
(और मैं अनुमान लगा रहा हूँ कि operator<<
इस तरह बुला शायद यूबी है)।
g++ -std=c++1y -Wall -Weffc++ -pedantic main.cpp
के साथ संकलित करते समय मुझे कोई चेतावनी या त्रुटियां नहीं मिलतीं।
- क्या कोई संकलक ध्वज है जिसे मैं सक्षम कर सकता हूं जो इस परिदृश्य में एक चेतावनी इंगित करता है?
- यदि नहीं, तो क्यों नहीं?
ठीक है, '2 का जवाब) 'यह है कि एक संकलक को लागू करने के लिए" चेतावनियां "अनिवार्य नहीं हैं। आप ऐसी चेतावनी जोड़ने के लिए g ++ के कार्यान्वयनकर्ता से पूछ सकते हैं (यदि यह पहले से मौजूद नहीं है), लेकिन उन्हें किसी भी मानक द्वारा ऐसा करने के लिए मजबूर नहीं किया जाता है। – PaulMcKenzie
@PaulMcKenzie, सच है, लेकिन जीसीसी उनकी चेतावनियों के साथ ऊपर और परे चला जाता है, मैं सोच रहा हूं कि इसका पता लगाने में तकनीकी कठिनाई है या नहीं? –
आपको उन इंजीनियरों से पूछना है जो संकलक को एकसाथ रखते हैं। वहां जवाब "यह एक अच्छा विचार" से कहीं भी हो सकता है "हमारे पास समय नहीं है" "यह पहले से मौजूद है"। – PaulMcKenzie