2013-06-26 57 views
0

我有类A,有更新B属性的方法。所以,我需要继承。C++继承与组合一起使用

class B{ 
public: 
int x; 
}; 

class A : public B{ 
public: 
void update(int y){ 
x = y; 
} 
}; 

我也想通过B类达到功能“更新”,所以我也需要组合。

class B{ 
public: 
A a; 
int x; 
}; 

class A : public B{ 
public: 
void update(int y){ 
x = y; 
} 
}; 

我希望我的结构正因为如此,所以我想跟踪对象类型B的性质是这样的:

... 
B.a.update(5); 
int n = B.x; 

然而,声明类A之前,我不能用的组合物,且不能使用在声明类B之前继承。我该如何解决这个无限循环?

+0

您的示例代码将无法正常工作,您无法在B.a上调用函数update()并将其分配给int。你必须定义一个转换运算符来做到这一点。 – bennofs

+0

bennofs;对象“a”是类型“A”,有一个名为update的方法,所以你可以做到这一点。 – baci

+0

好的,你纠正了它 – bennofs

回答

2

我不知道你想在这里实现什么,但如果我猜测正确的话,你可能需要的是一个虚函数:

class B{ 
public: 
int B; 
virtual void update(int x){ 
    B = x; 
} 
}; 

class A : public B{ 
public: 
virtual void update(int x){ 
    // Here goes code specific to B-class. 
    B::update(x); 
    // or here ;) 
} 
}; 

顺便说一句,你可能不希望int B字段在public:部分;如果您从update方法修改它的值,那么您可能不希望其他人尝试直接修改它。

+0

好的,我想更新B的属性THROUGH A,但是我也想通过B来达到这些方法;多数民众赞成我最终想要达到的。 – baci

+1

@C.CanberkBacı:'虚拟'功能是你如何做到这一点。 –

+0

正方形是一个矩形 - > is-a - >使用继承 汽车有一个窗口 - >有一个 - >使用组合 这是“C++思维”书提供给我的,所以我很困惑我的情况,仿佛这是不可能的。谢谢 – baci