面试题:C++ 什么场景下用继承?什么场景下使用组合?

在C++中,继承和组合是两种不同的代码复用方式,适用于不同的场景。

1. 继承的使用场景

继承用于表示“is-a”关系,即子类是父类的一种特殊类型。继承适合以下场景:

  • 代码复用:当多个类有共同的属性和行为时,可以将这些共同的部分提取到一个基类中,子类通过继承基类来复用代码。
  • 多态:通过基类指针或引用调用子类的重写函数,实现运行时多态。
  • 接口实现:通过纯虚函数定义接口,子类实现这些接口。

示例

class Animal {
public:
    virtual void makeSound() = 0; // 纯虚函数,定义接口
};

class Dog : public Animal {
public:
    void makeSound() override {
        std::cout << "Woof!" << std::endl;
    }
};

class Cat : public Animal {
public:
    void makeSound() override {
        std::cout << "Meow!" << std::endl;
    }
};

2. 组合的使用场景

组合用于表示“has-a”关系,即一个类包含另一个类的对象作为成员。组合适合以下场景:

  • 代码复用:通过将其他类的对象作为成员变量来复用其功能,而不是通过继承。
  • 灵活性:组合比继承更灵活,可以在运行时动态改变成员对象。
  • 避免继承的缺点:继承可能导致类层次结构过于复杂,组合可以避免这些问题。

示例

class Engine {
public:
    void start() {
        std::cout << "Engine started!" << std::endl;
    }
};

class Car {
private:
    Engine engine; // Car has-a Engine
public:
    void start() {
        engine.start();
        std::cout << "Car started!" << std::endl;
    }
};

3. 继承 vs 组合

  • 继承:适合“is-a”关系,子类是父类的特殊类型。继承关系是静态的,编译时确定。
  • 组合:适合“has-a”关系,一个类包含另一个类的对象。组合关系是动态的,可以在运行时改变。

4. 选择原则

  • 优先使用组合:组合比继承更灵活,更容易维护和扩展。优先考虑使用组合来实现代码复用。
  • 谨慎使用继承:继承容易导致类层次结构复杂化,增加耦合度。只有在明确“is-a”关系且需要多态时,才使用继承。

总结

  • 继承适用于“is-a”关系,适合代码复用和多态。
  • 组合适用于“has-a”关系,适合代码复用和灵活性。
  • 优先使用组合,谨慎使用继承。
THE END
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容