2013-04-12 90 views
0

我有4个类。类和纯虚拟

class Aclass Bclass CCclass D

类包括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)

这一切工作,但我怎么访问来自D类B类属性(b.gotoXY..)?

希望这使得Sence。

+2

你不让它_“朋友” _,你从它继承。 –

+2

请继续阅读[继承](http://stackoverflow.com/a/860353/57318)和[public/protected/private access](http://stackoverflow.com/a/614844/57318)。我们可以为你解答,但我担心你不明白为什么。 – Xymostech

回答

0

只要把它们protected部分:

class C { 
protected: 
    A &a; 
    B &b; 

    ... 
}; 

注:它无关virtual方法。

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 a friendC,您将有权访问ab,而无需将它们制作为protected。这将实现这样:

class C 
{ 
    // Some code... 
    friend D; 
    //Lots of code ... 
} 

请注意,这个工作,你需要C之前声明D

现在,你应该使用哪个这些选项?

问自己这个问题:是D逻辑更具体的类型C?如果是这样,它应该使用继承。如果没有,则可能会更好地使D拥有C类型的成员并使用friend关键字。在这两种情况下,使用friend谨慎,并且仅当有一定的两个类之间的非常紧密的关系(也许如果D是一家工厂为C类型和C有一个私人的构造函数)。

0

你应该把预期的成员protected或者让他们的班级friend到班上。

此外,我觉得当你从C实例化一个对象时,你会遇到问题,因为未初始化的引用。

class C 
{ 
private: 
    A &a; 
    B &b; 

    // ... 

public: 
    C(A &a, B &b) : a(a), b(b) 
        ^^^^^^^^^^^^ 
    // ... 
}; 
0
如果要在继承访问您的属性其他类

.dont私人他们
所以你可以选择保护或公开。 更多的细节,你可以去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); 
};