C++继承与多态:构建灵活对象模型,嵌入式ARM架构学习5——LED。
C++ 面向对象进阶:继承深化与多态详解
继承的深化
C++ 中的继承不仅是代码复用的手段,更是构建复杂类层次结构的核心机制。通过继承,派生类可以扩展或修改基类的行为,同时保持代码的逻辑一致性。
公有继承(public inheritance)
公有继承是最常见的继承方式,遵循“is-a”关系。派生类继承基类的公有和保护成员,并保持其原有访问权限。
class Base {
public:
void display() { cout << "Base class" << endl; }
};
class Derived : public Base {
public:
void show() { cout << "Derived class" << endl; }
};
保护继承(protected inheritance)与私有继承(private inheritance)
保护继承将基类的公有和保护成员变为派生类的保护成员;私有继承则将其变为私有成员。这两种方式较少使用,通常用于实现细节的封装。
多重继承与菱形继承问题
C++ 支持多重继承,允许一个类从多个基类派生。但多重继承可能导致菱形继承问题(Diamond Problem),即派生类间接继承同一基类的多份副本。通过虚继承(virtual inheritance)可以解决这一问题。
class A { public: int data; };
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {}; // 仅保留一份 A 的副本
多态的实现与虚函数
多态是面向对象编程的核心特性之一,允许通过基类指针或引用调用派生类的函数。C++ 通过虚函数(virtual function)实现运行时多态。
虚函数与动态绑定
在基类中声明虚函数后,派生类可以覆盖(override)这些函数。调用时根据对象的实际类型决定执行哪个版本的函数。
class Animal {
public:
virtual void speak() { cout << "Animal sound" << endl; }
};
class Dog : public Animal {
public:
void speak() override { cout << "Bark" << endl; }
};
Animal* animal = new Dog();
animal->speak(); // 输出 "Bark"
纯虚函数与抽象类
纯虚函数通过 = 0 语法声明,使基类成为抽象类,无法实例化。派生类必须实现所有纯虚函数才能成为具体类。
class Shape {
public:
virtual void draw() = 0; // 纯虚函数
};
class Circle : public Shape {
public:
void draw() override { cout << "Drawing a circle" << endl; }
};
多态的应用场景
多态在框架设计、插件系统和接口抽象中广泛应用。例如,通过基类指针管理不同派生类对象,实现统一的处理逻辑。
示例:多态容器
vector<Animal*> animals;
animals.push_back(new Dog());
animals.push_back(new Cat());
for (auto animal : animals) {
animal->speak(); // 根据具体对象调用不同实现
}
性能与注意事项
虚函数通过虚函数表(vtable)实现,会引入额外的间接调用开销。在性能敏感的代码中需谨慎使用。同时,避免过度设计继承层次,优先使用组合而非继承。
通过深入理解继承与多态,可以构建更灵活、可维护的面向对象程序。
更多推荐
所有评论(0)