2012-10-31 53 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; 
    }