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->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<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
是一个protected 基,那么它的公共和受保护成员可以被B
类及其朋友以及派生自B
及其朋友的类使用。只有B
的朋友和成员以及从B
派生的类的朋友和成员才能将B*
转换为A*
。
如果A
最终是一个public基,那么它的公共成员可以被任何类使用,它的受保护成员可以被派生类及其朋友以及从@987654345派生的类使用@ 和他们的朋友。任何函数都可以将B*
转换为A*
。
还请注意,您不能将 constness 与 dynamic_cast
或 static_cast
一起投射,据说它们都尊重 constness。他们都尊重 访问 控件(不可能强制转换为私有基数 [因为只有派生类方法可能会这样做 Derived* -> 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->getX();
类声明后的逗号
【讨论】:
我的帖子拼错了。我就是这样做的【参考方案6】:你忘了;在你的吸气剂返回
int getX() return _x; ;
【讨论】:
以上是关于2个类的getter继承问题的主要内容,如果未能解决你的问题,请参考以下文章