2012-10-14 19 views

उत्तर

5

इस मामले में कोई फर्क नहीं पड़ता।

इस टिप्पणी:

obj.Class::member

केवल अस्पष्टता विरासत से आने वाले हल करने के लिए है:

class A { 
public: 
    int a; 
} 

class B { 
public: 
    int a; 
} 

class C : public A, B { 
    void func() { 
     // this objects holds 2 instance variables of name "a" inherited from A and B 
     this->A::a = 1; 
     this->B::a = 2; 
    } 

} 
6

की एक वस्तु है कोई फर्क नहीं है। इस मामले में ar की स्पष्ट नामस्थान योग्यता अनावश्यक है।

यह उन मामलों में अनावश्यक नहीं हो सकता है जहां (एकाधिक, nonvirtual) विरासत ar नाम को फिर से परिभाषित करता है। नमूना (काल्पनिक):

#include <string> 

class A 
{ 
    public: 
     int *ar; 
     A() { ar = new int[100]; } 
     // unrelated, but prevent leaks: (Rule Of Three) 
     ~A() { delete[] ar; } 
    private: 
     A(A const&); 
     A& operator=(A const&); 
}; 

class B : public A 
{ 
    public: 
     std::string ar[12]; 
}; 


int main() 
{ 
    B ob; 
    ob.A::ar[0] = 200; 
    ob.ar[0] = "hello world"; 
} 

वहाँ कोई अंतर नहीं है http://liveworkspace.org/code/d25889333ec378e1382cb5af5ad7c203

+0

क्या आप कक्षा ए में निजी कोड के रूप में जो लिखा है उसे समझा सकते हैं? – Rushil

+1

@ रुशिल वेल, यह वास्तव में ऑफ-विषय है: यह 'ए' को कॉपी करने से रोकने का सबसे तेज़ तरीका है (जिससे 'ए :: एआर' को दोगुना हटा दिया जाएगा)। इसे [नियम का तीन] कहा जाता है (http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) या, सी ++ 11 [शून्य का नियम] में (http: // rmartinho .github.com/2012/08/15/rule-of-zero.html) इसके बजाय :) – sehe

+0

ठीक है। मुझे पता है कि यह विषय बंद है लेकिन मैं जानना चाहता था कि इसका क्या अर्थ है। :-) – Rushil

1

पर यह देखें इस मामले में। हालांकि कल्पना करें कि ओबी कक्षा सी का है जो कक्षा ए और कक्षा बी दोनों से विरासत में है और ए और बी दोनों में एक क्षेत्र है। फिर ar तक पहुंचने का कोई और तरीका नहीं होगा, लेकिन स्पष्ट रूप से निर्दिष्ट करने के लिए कि आप किस विरासत वाले डेटा सदस्यों को रेफर कर रहे हैं।

0

आप इस

ob.A::ar[0] = 200; 
ob.ar[0] = 200; 

इस

की तरह पढ़ने के लिए अपेक्षा की जाती है

A::ar[0] यह ar[0] के लिए एक ही बात है, तो 2 पंक्तियाँ मूल रूप से एक ही बात कर रहे हैं और ऑपरेटर :: नाम स्थान, या बस नाम स्थान के तथाकथित संकल्प इंगित करने के लिए प्रयोग किया जाता है।

ob के बाद से टाइप ए का एक ऑब्जेक्ट है, नामस्थान रिज़ॉल्यूशन निहित है और ar[0] तक पहुंचने से पहले आपको A:: की आवश्यकता नहीं है।

संबंधित मुद्दे