2个类的getter继承问题

Posted

技术标签:

【中文标题】2个类的getter继承问题【英文标题】:getter inheritance issue with 2 classes 【发布时间】: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 给出引用的错误。 【参考方案1】:

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

在private inheritance,

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

来自标准文档,11.2.2

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

【讨论】:

【参考方案2】:

继承分为三种:

    公开 受保护 私人

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; ;

【讨论】:

以上是关于2个类的getter继承问题的主要内容,如果未能解决你的问题,请参考以下文章

Java容器结构总结 ---讲了很多类的大致关联和继承关系 粗略讲了几个类

Flutter/Dart - 类的继承

java继承

C# 包含继承类的基类数组,访问非继承字段

kotlin学习总结——类和对象继承接口和抽象类

javaSE练习13——(知识点:类的继承 方法的覆盖)