我有4节课。
class A
,class B
,class C
,class D
班级C
包括班级A
和班级B
并引用它们:
标题文件:
class C
{
private:
A &a;
B &b;
int x;
int y;
int energy;
public:
C(A &a, B &b);
void print(void);
virtual void printAt(void);
CPP文件包括:
void C::printAt(void)
{
// move cursor to the current x, y coordinates
b.gotoXY(x,y);
}
在课程D
中,我将课程C
设为(class D : public class C...
)
然后我有void printAt(void)
。
这一切都有效,但如何从课程b.gotoXY..
访问b类属性(D
)?
希望这会让Sence。
答案 0 :(得分:0)
只需将它们放入protected
部分:
class C {
protected:
A &a;
B &b;
...
};
注意:它与virtual
方法无关。
答案 1 :(得分:0)
您无法从D
访问它们的原因是因为它们是private
,这意味着它们只能从D
内部访问。为了能够仅从D
或其子类访问它们,您需要使用protected
访问修饰符:
class C
{
private:
int x;
int y;
int energy;
protected:
A &a;
B &b;
public:
C(A &a, B &b);
void print(void);
virtual void printAt(void);
/// ...
};
现在,有点术语:
当您键入class C : public D
时,您没有将其设为friend
,而是继承它。这意味着C
将是D
的基类。朋友是另一个相关的概念。
某个类的朋友是另一个可以访问其private
属性的类。因此,如果您改为D
friend
C
,则可以访问a
和b
而无需制作protected
class C
{
// Some code...
friend D;
//Lots of code ...
}
}}。这将是这样完成的:
D
请注意,要实现此目的,您需要在C
之前声明D
。
现在,您应该使用以下哪个选项?
问自己这个问题:C
逻辑上是D
更具体的类型吗?如果是这样,它应该使用继承。如果没有,最好让C
拥有friend
类型的成员并使用friend
关键字。在任何一种情况下,请谨慎使用D
,并且只有在两个类之间必然存在非常紧密的关系时(可能C
是C
类型的工厂和{{1}}有一个私人构造函数。)
答案 2 :(得分:0)
您应该让目标成员protected
或将他们的课程friend
提交给您的班级。
此外,我觉得当您从C
实例化一个对象时,由于未初始化的引用,您会遇到问题。
class C
{
private:
A &a;
B &b;
// ...
public:
C(A &a, B &b) : a(a), b(b)
^^^^^^^^^^^^
// ...
};
答案 3 :(得分:0)
当你希望继承中的其他类访问你的属性时。不要私有他们
所以你可以选择受保护或公开。
有关详细信息,请访问http://www.learncpp.com/cpp-tutorial/115-inheritance-and-access-specifiers/
解决问题尝试下面的代码
class C
{
protected://or public
A &a;
B &b;
int x;
int y;
int energy;
public:
C(A &a, B &b);
void print(void);
virtual void printAt(void);
并在class D
class D:public C
{
public:
void printAt(void);
};