Lum*_*ria 3 c++ oop inheritance class composition
我试图了解C ++中组成与继承之间的语法差异。
我希望有人会提供两个简单的例子。使用组成的类的一个示例,使用继承的类的一个示例。
cos*_*193 10
为了稍微扩展@jeremy-friesner 的答案(并且主要是重用他的代码),很多时候组合是使用比这更多的类来实现的。Legs 和 Arms 类本质上是接口的实现。这使得注入这些依赖项变得容易,因此在对复合对象进行单元测试时模拟/存根它们。然后你会有类似的东西(忽略虚拟析构函数......):
class Walker // interface
{
public:
virtual void Walk() = 0;
}
class Legs : public Walker
{
public:
void Walk() {... code for walking around goes here...}
}
class Grabber // Interface
{
public:
virtual void GrabThings() = 0;
}
class Arms : public Grabber
{
public:
void GrabThings() {... code for grabbing things goes here...}
}
class InheritanceRobot : public Legs, public Arms
{
public:
// Walk() and GrabThings() methods are implicitly
// defined for this class since it inherited those
// methods from its two superclasses
};
class CompositionRobot
{
public:
CompositionRobot(Walker& walker, Grabber& grabber)
: legs(walker),
arms(grabber)
{}
void Walk() {legs.Walk();}
void GrabThings() {arms.GrabThings();}
private:
Walker& legs;
Grabber& arms;
};
Run Code Online (Sandbox Code Playgroud)
因此用于腿和手臂的实际实现可以在运行时而不是编译时设置。
顺便说一句,我写这个只是作为一个答案,而不是对 Jeremy 的答案的评论,以便从代码格式中受益,因此,如果您想对它进行投票,请也做 Jeremy 的。
HTH
当然可以,为什么不呢?因为我喜欢机器人,所以让我们制造一个可以四处走动并抓东西的机器人。我们将使一个机器人使用继承,而另一个机器人使用合成:
class Legs
{
public:
void Walk() {... code for walking around goes here...}
}
class Arms
{
public:
void GrabThings() {... code for grabbing things goes here...}
}
class InheritanceRobot : public Legs, public Arms
{
public:
// Walk() and GrabThings() methods are implicitly
// defined for this class since it inherited those
// methods from its two superclasses
};
class CompositionRobot
{
public:
void Walk() {legs.Walk();}
void GrabThings() {arms.GrabThings();}
private:
Legs legs;
Arms arms;
};
Run Code Online (Sandbox Code Playgroud)
请注意,至少对于本示例而言,CompositionRobot
通常认为是更好的方法,因为继承表示一种is-a
关系,并且机器人不是特定种类的Arms
机器人,机器人也不是特定种类的Legs
机器人(而是has-arms
and has-legs
) 。