课程&纯虚拟

时间:2013-04-12 15:15:28

标签: c++ virtual

我有4节课。

class Aclass Bclass Cclass 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。

4 个答案:

答案 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,则可以访问ab而无需制作protected class C { // Some code... friend D; //Lots of code ... } }}。这将是这样完成的:

D

请注意,要实现此目的,您需要在C之前声明D

现在,您应该使用以下哪个选项?

问自己这个问题:C逻辑上是D更具体的类型吗?如果是这样,它应该使用继承。如果没有,最好让C拥有friend类型的成员并使用friend关键字。在任何一种情况下,请谨慎使用D,并且只有在两个类之间必然存在非常紧密的关系时(可能CC类型的工厂和{{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);
};