【问题标题】:getter inheritance issue with 2 classes2个类的getter继承问题
【发布时间】:2013-05-30 08:53:57
【问题描述】:

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

这也不起作用!

【问题讨论】:

  • 您好像在class B: **public A** 中忘记了public
  • 来吧,发布一个真实代码!你的 sn-p 甚至没有编译!
  • 我不会为一个在 3 分钟内得到 5 个答案的问题发布 200 条无用的行...
  • @gx_ 它无法编译,他问为什么它不是以及如何修复它。
  • @Daniel 由于 other 错误而无法编译,而不是“'getX' is a private member of 'A'”:int getX(){return _x}; 应该是 int getX(){return _x;}this.getX() 应该是 this-&gt;getX()(OP 之后编辑),并且两个类定义在右大括号后都缺少一个分号。在这些更正之后(并将 qDebug() 替换为 cout 或您可以包含的任何内容),代码编译并且 not 给出引用的错误。

标签: c++ inheritance


【解决方案1】:

当您未指定继承类型时,default 将被视为私有。

private inheritance

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

来自标准文档,11.2.2

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

【讨论】:

    【解决方案2】:

    继承分为三种:

    1. 公开
    2. 受保护
    3. 私人

    class的dafult模式是private,struct是public:

    在基类没有访问说明符的情况下,public 是 当派生类使用类键结构定义时假定 并且当使用 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&lt;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 是一个protected 基,那么它的公共和受保护成员可以被B 类及其朋友以及派生自B 及其朋友的类使用。只有B 的朋友和成员以及从B 派生的类的朋友和成员才能将B* 转换为A*

    如果A最终是一个public基,那么它的公共成员可以被任何类使用,它的受保护成员可以被派生类及其朋友以及从@987654345派生的类使用@ 和他们的朋友。任何函数都可以将B* 转换为A*

    还请注意,您不能将 constnessdynamic_caststatic_cast 一起投射,据说它们都尊重 constness。他们都尊重 访问 控件(不可能强制转换为私有基数 [因为只有派生类方法可能会这样做 Derived* -&gt; Base* 和类的方法是这个的朋友{朋友声明在 Base}])

    Stroustrup 中的更多内容(“C++”,15.3.2)

    【讨论】:

      【解决方案3】:

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

      class B: public A
      

      那你就不会报错了

      【讨论】:

        【解决方案4】:

        试试这个:

        //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】:

          你的代码应该如下:

          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-&gt;getX();
          • 类声明后的逗号

          【讨论】:

          • 我的帖子拼错了。我就是这样做的
          【解决方案6】:

          你忘了;在你的吸气剂返回

          int getX() { return _x; };
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-10-19
            • 2010-10-30
            • 2012-05-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多