MST

星途 面试题库

面试题:C++ 单继承体系下代码复用的多重继承隐患规避

假设我们在C++ 单继承体系中有一个`Animal`基类,`Mammal`和`Bird`都继承自`Animal`。现在想通过代码复用创建一个`FlyingMammal`类,既要具备`Mammal`的特性,又要有飞行能力(类似`Bird`的部分能力)。但多重继承会带来菱形继承等问题,如何在尽量复用现有代码的基础上,优雅地实现`FlyingMammal`类,避免多重继承的隐患?请阐述思路并给出关键代码片段。
38.2万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 思路

    • 采用组合(Composition)和委托(Delegation)的方式来实现代码复用,而不是多重继承。
    • 创建一个接口类来定义飞行相关的行为,Bird类和FlyingMammal类都实现这个接口。
    • FlyingMammal类组合一个实现飞行接口的对象,并将飞行相关的操作委托给这个对象。
  2. 关键代码片段

// 定义飞行接口
class Flyable {
public:
    virtual void fly() = 0;
};

// 基类Animal
class Animal {
public:
    // 基类成员和方法
    virtual void breathe() {
        std::cout << "Animal is breathing." << std::endl;
    }
};

// Mammal类继承自Animal
class Mammal : public Animal {
public:
    // Mammal类成员和方法
    void nurse() {
        std::cout << "Mammal is nursing." << std::endl;
    }
};

// Bird类继承自Animal并实现Flyable接口
class Bird : public Animal, public Flyable {
public:
    void fly() override {
        std::cout << "Bird is flying." << std::endl;
    }
};

// 专门用于飞行能力的类,实现Flyable接口
class FlyingAbility : public Flyable {
public:
    void fly() override {
        std::cout << "Using flying ability." << std::endl;
    }
};

// FlyingMammal类继承自Mammal,并组合一个FlyingAbility对象
class FlyingMammal : public Mammal {
private:
    FlyingAbility flyingObj;
public:
    // 将飞行操作委托给flyingObj
    void fly() {
        flyingObj.fly();
    }
};

在上述代码中,FlyingMammal类通过组合FlyingAbility对象获得了飞行能力,同时继承自Mammal类获得了哺乳动物的特性,避免了多重继承带来的菱形继承等问题。