我正在尝试使用以下代码,但是我找不到足够好的文档来说明C ++如何处理公共继承和私有继承以允许我做我想要的事情。如果有人可以解释为什么我无法使用私有继承访问Parent::setSize(int)
或Parent::size
或使用公共继承访问Parent::size
。要解决此问题,我需要在Parent中使用getSize()
和setSize()
方法吗?
class Parent {
private:
int size;
public:
void setSize(int s);
};
void Parent::setSize(int s) {
size = s;
}
class Child : private Parent {
private:
int c;
public:
void print();
};
void Child::print() {
cout << size << endl;
}
int main() {
Child child;
child.setSize(4);
child.print();
return 0;
}
答案 0 :(得分:14)
将父母更改为:
protected: int size;
如果您想要从派生类访问size
成员,而不是从类外部访问,那么您需要protected
。
将儿童改为:
class Child: public Parent
当你说class Child: private Parent
时,你说这应该是Child是父母的秘密。您的main
代码清楚地表明您希望将Child作为父级进行操作,因此它应该是公共继承。
答案 1 :(得分:5)
使用私有继承时,基类的所有公共成员和受保护成员在派生类中变为私有。在您的示例中,setSize
在Child
中变为私有,因此您无法从main
调用它。
此外,size
中的Parent
已经隐私了。一旦声明为private,则无论继承的类型如何,成员始终对基类保持私有。
答案 2 :(得分:0)
您无法访问其他类的私有数据成员。如果要访问超级类的私有属性,则应通过公共访问者或受保护的访问者进行访问。至于其余部分,请参阅@ casablanca的answer。
答案 3 :(得分:0)
#include <iostream>
using namespace std;
class Parent {
private:
int size;
public:
void setSize(int s);
int fun() //member function from base class to access the protected variable
{
return size;
}
};
void Parent::setSize(int s) {
size = s;
}
class Child : private Parent {
private:
int c;
public:
void print();
using Parent::setSize; //new code line
using Parent::fun; //new code line
};
void Child::print() {
cout << fun() << endl;
}
int main() {
Child child;
child.setSize(4);
child.print();
return 0;
}