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

6 回答 6

8

问题是你在这里不小心使用了私有继承

class derived : base {

这使得派生类中的所有基类成员都是私有的。

将此更改为

class derived : public base {

它会按预期工作。

于 2012-10-31T13:59:51.090 回答
6

您从基类私下继承。您通常需要的是公共继承:

class derived : public base

这是关于私有继承的常见问题解答。

于 2012-10-31T13:59:17.640 回答
3

base那么,您应该从公开继承。

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

私有继承在非常特殊的情况下使用,例如当您has-a在两个类之间存在关系时,但您还需要覆盖基类的成员。

于 2012-10-31T14:00:05.313 回答
1

从类外部,你只能访问公共基类的公共成员;class当您使用关键字定义类时,默认情况下继承是私有的。

为了使其可访问,您需要公共继承:

class derived : public base
                ^^^^^^
于 2012-10-31T14:00:24.700 回答
1

尝试:

class derived : public base {
    ...
};
于 2012-10-31T14:00:41.730 回答
0

使用公共继承:

class derived : public base {
  ...
};

或者

将 x 设为私有而不是公开,并使用以下代码:

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;
    }
于 2014-02-05T14:09:29.543 回答