2012-10-31 59 views
4

是否有可能從程序中某些其他位置的派生類實例訪問基類公共成員。從派生類訪問基類公共成員

class base { 
public: 
    int x; 

    base(int xx){ 
    x = xx; 
    } 
}; 

class derived : base { 
public: 
    derived(int xx) : base(xx){ 
    } 
}; 

class main { 
public: 
    derived * myDerived;  

    void m1(){ 
     myDerived = new derived(5); 
     m2(myDerived); 
    } 

    void m2(derived * myDerived){ 
     printf("%i", myDerived->x); 
    }  
}; 

上面的代碼後,我得到以下錯誤。

`error: 'int base::x' is inaccessible` 
+4

'class main'?不好。 –

回答

5

您可以從基類私下繼承。您通常需要的是公共繼承:

class derived : public base 

這是關於私有繼承的FAQ

7

的問題是,你不小心在這裏使用

class derived : base { 

私有繼承這使得所有基類成員在派生類中的私有。

更改爲

class derived : public base { 

,並預期它會奏效。

3

那麼你應該公開繼承base

class derived : public base { 
public: 
    derived(int xx) : base(xx){ 
    } 
}; 

私有繼承是非常特殊的情況,比如當你有兩個類之間的關係has-a使用,但你也需要重寫基類中的一員。

1

從課外,您只能訪問公共基礎班的公共成員;並且在使用class關鍵字定義類時,默認情況下繼承是私有的。

爲了使訪問,你需要公有繼承:

class derived : public base 
       ^^^^^^ 
1

嘗試:

class derived : public base { 
    ... 
}; 
0

使用公有繼承:

class derived : public base { 
    ... 
}; 

製作X私人代替公共的a nd使用以下代碼:

class Base { 
     int x; 
     public: 
      Base (int xx) { 
       x = xx; 
      } 
      void display() { 
       cout << "x = " << x << endl; 
      } 
    }; 

    class Derived : public Base { 
     public: 
      Derived (int xx) : Base (xx) { 
      } 
    }; 

    int main() { 
     Derived d1(2); 
     Derived *d = new Derived(10); 
     d->display(); 
     d1.display(); 
     return 0; 
    }