0

我有 2 个课程(尽可能简单的自愿),我正在Qt研究Mac OS X

//Class A
class A
{
protected:
    int getX(){return _x;};
private:
    int _x;
};

//Class B
class B : A
{
    void method(){qDebug() << this->getX();}
};

编译器抛出:

错误:“getX”是“A”的私有成员

我错过了什么吗?我试过:

qDebug() << this->A::getX();

这也不起作用!

4

6 回答 6

6

当您不指定继承类型时,默认将被视为私有。

私有继承中,

基类的公共成员是私有的。

来自标准文档,11.2.2

在基类没有访问说明符的情况下,当派生类使用 class-key struct 定义时假定为 public,而当使用 class-key class定义类时假定为 private

于 2013-05-30T08:59:31.553 回答
4

继承分为三种:

  1. 上市
  2. 受保护
  3. 私人的

class 的 dafult 模式是私有的,而 struct 是公共的:

在基类没有访问说明符的情况下,当派生类使用 class-key struct 定义时假定为 public,而当使用 class-key class定义类时假定为 private

                                                   [From C++ standard, 11.2.2]

所以,当你说:

class B: A

这是私有继承,因此基类的所有公共和受保护成员都将作为私有继承。你需要的是

class B: public A

或者

class B: protected A

私有和受保护的继承更常用于定义实现细节。在通过将接口限制为基类来定义类时,私有基类最有用,这样可以提供更强的保证。例如,Vec将范围检查添加到其私有基vector(§3.7.1)和list指针模板将类型检查添加到其list<void*>基 -> 参见 Stroustrup(“C++ ...”§13.5)。

例子:

//Class A
class A
{
public:
    int getX(){return _x;};
protected:
    int getX2(){return _x;}
private:
    int _x;
};

//Class B
class B : protected A  //A::getX and A::getX2 are not visible in B interface,
          ^^^^^^^^^    // but still we can use it inside B class: inherited
                       // members are always there, the inheritance mode
                       // affects only how they are accessible outside the class
                       // in particular for a children
{
public:
    int method(){ return this->getX();}
    int method2(){ return this->getX2();}
};

int main(int argc, char** argv) {

    B b=B();
    printf("b.getX(): %d",b.method());  // OK
    printf("b.getX(): %d",b.method2()); // OK

    return 0;
}

对继承的进一步影响

此外,当您将类声明为

class B: A

class B: private A进一步继承相同变得不可用:只有派生自A及其朋友的类才能使用A公共成员和受保护成员。只有朋友和成员B可以转换B*A*.

如果A是一个受保护的基类,那么它的公共成员和受保护成员可以被类B及其朋友以及派生自B其朋友的类使用。只有friends and members ofB和friends and members of class derived fromB可以转换B*A*.

如果最终A是一个公共基础,那么它的公共成员可以被任何类使用,它的受保护成员可以被派生类及其朋友以及派生类B及其朋友使用。任何函数都可以转换B*A*.

另请注意,您不能使用or强制转换常量,据说它们都尊重常量。它们也都尊重访问控制(不可能强制转换为私有基[因为只有派生类方法可能会这样做,并且类的方法是这个 {friend 声明在 Base} 中的朋友])dynamic_caststatic_castDerived* -> Base*

更多在 Stroustrup ("C++", 15.3.2)

于 2013-05-30T09:10:20.507 回答
3

当你从另一个类继承一个类时,应该提到继承的模式。所以,你必须声明为

class B: public A

然后你不会有错误

于 2013-05-30T08:57:08.760 回答
1

您的代码应如下所示:

class A {
    protected:
        int getX() { return _x; }

    private:
        int _x;
};

//Class B
class B : public A  {
    void method() { this->getX(); }
};

他们有很多错误:

  • class B: public A;
  • this->getX();
  • 类声明后的逗号
于 2013-05-30T08:57:12.220 回答
1

尝试这个:

//Class A
class A
{
protected:
    int getX(){return _x};
private:
    int _x;
};

//Class B
class B : public A
{
    void method(){qDebug() << this->getX();}
};

您忘记了关键字public,您没有this用作指针,并且忘记了;类末尾的 。

于 2013-05-30T08:58:26.063 回答
0

你忘了 ; 在你的吸气剂回报中

int getX() { return _x; };
于 2013-05-30T08:56:46.027 回答