我有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();
哪个也不起作用!
答案 0 :(得分:6)
如果未指定继承类型,则default将被视为私有。
基类'公共成员是私人成员。
从标准文档 11.2.2
在没有基类的访问说明符的情况下,public是 假定使用class-key结构定义派生类时 当使用class-key定义类时,假定 private 类强>
答案 1 :(得分: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_cast
或static_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)
int getX() { return _x; };