返回

OOP基础篇:揭秘C++中类的继承,掌握继承的奥秘

后端

C++中的继承:对象间的层级关系

在C++中,继承是一种强大的机制,它允许您利用现有类的特性来创建新类。继承能够帮助您重用代码,提高开发效率,并创建更具可扩展性和可维护性的软件系统。C++支持多种形式的继承,包括:

  • 单继承: 一个类继承自一个父类。
  • 多继承: 一个类继承自多个父类。
  • 层次继承: 一个类继承自另一个类,而另一个类又继承自另一个类,如此依次下去。
  • 菱形继承: 一个类继承自两个父类,而这两个父类又都继承自同一个类。
  • 混合继承: 一个类继承自两个或多个父类,而这些父类之间没有直接的继承关系。

单继承:扩展父类功能

单继承是最简单的继承形式。它允许您从一个父类继承特性,并在此基础上扩展其功能。例如,您可以创建一个Animal类,并从它派生出DogCat类。DogCat类将继承Animal类中的属性和方法,但它们也可以拥有自己的特有属性和方法。

class Animal {
public:
    void eat() {
        cout << "Animal is eating" << endl;
    }
};

class Dog : public Animal {
public:
    void bark() {
        cout << "Dog is barking" << endl;
    }
};

class Cat : public Animal {
public:
    void meow() {
        cout << "Cat is meowing" << endl;
    }
};

int main() {
    Animal animal;
    animal.eat();

    Dog dog;
    dog.eat();  // Inherited from Animal
    dog.bark(); // Unique to Dog

    Cat cat;
    cat.eat();  // Inherited from Animal
    cat.meow(); // Unique to Cat

    return 0;
}

多继承:整合父类特性

多继承允许您从多个父类继承特性。这可以帮助您创建具有来自多个父类特性的类。例如,您可以创建一个Vehicle类,并从它派生出CarTruck类。CarTruck类将继承Vehicle类中的属性和方法,但它们也可以拥有自己的特有属性和方法。

class Vehicle {
public:
    void drive() {
        cout << "Vehicle is driving" << endl;
    }
};

class Car : public Vehicle {
public:
    void honk() {
        cout << "Car is honking" << endl;
    }
};

class Truck : public Vehicle {
public:
    void haul() {
        cout << "Truck is hauling" << endl;
    }
};

int main() {
    Vehicle vehicle;
    vehicle.drive();

    Car car;
    car.drive();  // Inherited from Vehicle
    car.honk(); // Unique to Car

    Truck truck;
    truck.drive();  // Inherited from Vehicle
    truck.haul(); // Unique to Truck

    return 0;
}

层次继承:构建对象族谱

层次继承允许您创建一个类的层级结构,其中每个类都从一个父类继承特性。这可以帮助您创建具有不同级别的特性的对象。例如,您可以创建一个Animal类,并从它派生出Mammal类,再从Mammal类派生出DogCat类。DogCat类将继承Mammal类和Animal类中的属性和方法,但它们也可以拥有自己的特有属性和方法。

class Animal {
public:
    void eat() {
        cout << "Animal is eating" << endl;
    }
};

class Mammal : public Animal {
public:
    void giveBirth() {
        cout << "Mammal is giving birth" << endl;
    }
};

class Dog : public Mammal {
public:
    void bark() {
        cout << "Dog is barking" << endl;
    }
};

class Cat : public Mammal {
public:
    void meow() {
        cout << "Cat is meowing" << endl;
    }
};

int main() {
    Animal animal;
    animal.eat();

    Mammal mammal;
    mammal.eat();  // Inherited from Animal
    mammal.giveBirth(); // Unique to Mammal

    Dog dog;
    dog.eat();  // Inherited from Animal
    dog.giveBirth();  // Inherited from Mammal
    dog.bark(); // Unique to Dog

    Cat cat;
    cat.eat();  // Inherited from Animal
    cat.giveBirth();  // Inherited from Mammal
    cat.meow(); // Unique to Cat

    return 0;
}

菱形继承:处理重复继承

菱形继承是一种特殊的继承形式,其中一个类继承自两个父类,而这两个父类又都继承自同一个类。这可能导致重复的特性和方法,因为子类同时继承了两个父类中的相同特性和方法。菱形继承通常不推荐使用,因为它可能导致代码的复杂性和难以维护。

class A {
public:
    void f() {
        cout << "A::f()" << endl;
    }
};

class B : public A {
public:
    void g() {
        cout << "B::g()" << endl;
    }
};

class C : public A {
public:
    void h() {
        cout << "C::h()" << endl;
    }
};

class D : public B, public C {
public:
    void i() {
        cout << "D::i()" << endl;
    }
};

int main() {
    D d;
    d.f();  // Ambiguous, both A and C have f()
    d.g();  // Unique to B
    d.h();  // Unique to C
    d.i();  // Unique to D

    return 0;
}

混合继承:组合不同父类特性

混合继承是一种特殊的继承形式,其中一个类继承自两个或多个父类,而这些父类之间没有直接的继承关系。这允许您组合来自不同父类的特性,并创建具有独特功能的新类。混合继承通常用于创建具有不同接口或功能的类。

class A {
public:
    void f() {
        cout << "A::f()" << endl;
    }
};

class B {
public:
    void g() {
        cout << "B::g()" << endl;
    }
};

class C : public A, public B {
public:
    void h() {
        cout << "C::h()" << endl;
    }
};

int main() {
    C c;
    c.f();  // Inherited from A
    c.g();  // Inherited from B
    c.h();  // Unique to C

    return 0;
}