C++入门——60s从0到1
继承与组合
在C++中,继承和组合都是实现代码重用的常见技术。它们可以帮助我们避免重复编写代码,提高代码的复用性和可维护性。
继承
继承是一种机制,它允许我们定义一个新的类(称为派生类),该类继承自一个现有的类(称为基类)。派生类可以访问基类的成员,包括属性和方法。继承可以让我们在已有的类的基础上构建新的类,而不需要从头开始编写。
继承通常用于表示“是一个”关系,即派生类是基类的一种特定类型。例如,如果我们有一个名为 `Animal` 的基类,那么我们可以创建一个名为 `Cat` 的派生类,表示猫是一种动物。
#include <iostream> using namespace std; class Animal { public: void eat() { cout << "Animal is eating." << endl; } }; class Cat : public Animal { public: void meow() { cout << "Meow!" << endl; } }; int main() { Animal* animal = new Cat(); // 基类指针指向派生类对象 animal->eat(); // 调用 Animal::eat() animal->meow(); // 调用 Cat::meow() delete animal; return 0; }
在上面的例子中,我们创建了一个 `Cat` 类型的对象,并通过基类指针将其赋值给 `Animal` 类型的指针 `animal`。然后,我们通过 `animal` 调用了 `eat()` 和 `meow()` 函数。需要注意的是,虽然 `animal` 是基类的指针,但是它指向的是一个派生类的对象,所以它可以调用基类和派生类的成员函数。
继承的优点是可以减少代码的重复性,同时也可以提高代码的可维护性。但是需要注意的是,过度使用继承可能会导致代码的复杂性增加,因为派生类会继承基类的所有成员,包括一些可能不需要的成员。这可能会导致代码冗余和不必要的开销。
组合
组合是一种机制,它允许我们将一个类的对象作为一个整体包含在另一个类的对象中。组合通常用于表示“有”关系,即一个对象包含另一个对象。例如,如果我们有一个名为 `Car` 的类,那么我们可以将一个名为 `Engine` 的类作为 `Car` 的一部分来包含进来。
#include <iostream> using namespace std; class Engine { public: void run() { cout << "Engine is running." << endl; } }; class Car { public: Engine* engine; // 包含一个 Engine 的指针 Car(Engine& engine) : engine(&engine) {} // 将 Engine 的引用传递给 Car 的构造函数 void drive() { engine->run(); // 调用 Engine::run() } }; int main() { Engine engine; // 创建一个 Engine 对象 Car car(engine); // 将 Engine 的引用传递给 Car 的构造函数 car.drive(); // 调用 Car::drive() 和 Engine::run() return 0; }
在上面的例子中,我们创建了一个 `Engine` 类型的对象和一个 `Car` 类型的对象。然后我们将 `Engine` 的引用传递给了 `Car` 的构造函数,这样就可以在 `Car` 中使用 `Engine` 的成员函数了。通过这种方式,我们可以将多个独立的类组合成一个更复杂的对象。组合的优点是可以提高代码的可维护性和可扩展性,因为它可以将相关的功能组织在一起,并减少代码的重复性。但是需要注意的是,组合可能会导致对象之间的依赖关系变得更加复杂,因此需要谨慎使用。