getter继承问题有2个类

时间:2013-05-30 08:53:58

标签: c++ inheritance

我有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();

哪个也不起作用!

6 个答案:

答案 0 :(得分:6)

如果未指定继承类型,则default将被视为私有。

private inheritance

基类'公共成员是私人成员。

从标准文档 11.2.2

  

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

答案 1 :(得分:4)

有三种类型的继承:

  1. 公共
  2. 保护
  3. 私有
  4. 类的dafult模式是private,而struct是public:

      

    在没有基类的访问说明符的情况下,public是   假定使用class-key结构定义派生类时   当使用class-key定义类时,假定 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*>基础 - &gt;参见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派生的类使用他们的朋友们。只有B的朋友和成员以及来自B的朋友和班级成员才能将B*转换为A*

    如果A最终是 public 基础,则其公共成员可以被任何类使用,其受保护的成员可以由派生类及其朋友使用,也可以由派生自B和他们的朋友。任何函数都可以将B*转换为A*

    另请注意,您无法使用dynamic_caststatic_cast投射 constness ,据说他们都尊重常量。他们也都尊重访问控件(无法转换为私有基础 [因为只有派生类方法可能会Derived* -> Base*和类的方法成为朋友这个{朋友声明在基地}])

    更多在Stroustrup(“C ++”,15.3.2)

答案 2 :(得分:3)

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

class B: public A

然后你就不会有错误

答案 3 :(得分: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();
  • 课后声明
  • 逗号

答案 4 :(得分: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作为指针而忘记了课程末尾的;

答案 5 :(得分:0)

你忘记了;在你的getter回归中

int getX() { return _x; };