C++继承与多态进阶实战指南
好的以下是用C实现继承与多态的中级概念解析一、动态绑定与虚函数在继承体系中通过虚函数实现运行时多态性class Animal { public: virtual void speak() { std::cout Animal sound std::endl; } virtual ~Animal() default; // 建议基类使用虚析构 }; class Dog : public Animal { public: void speak() override { std::cout Woof! std::endl; } }; class Cat : public Animal { public: void speak() override { std::cout Meow! std::endl; } }; // 用法示例 void makeSound(Animal* animal) { animal-speak(); // 根据实际对象类型调用对应方法 }二、抽象类与纯虚函数定义需被强制实现的接口class Shape { public: virtual double area() const 0; // 纯虚函数 virtual ~Shape() default; }; class Circle : public Shape { private: double r; public: Circle(double radius) : r(radius) {} double area() const override { return 3.14159 * r * r; } }; // 不可实例化抽象类 // Shape s; // 编译错误三、类型识别与dynamic_cast运行时类型安全检查Animal* animal new Dog(); if (auto* dogPtr dynamic_castDog*(animal)) { dogPtr-fetchBall(); // 调用Dog特有方法 } else { // 处理非Dog类型 }⚠️注意必须启用RTTI编译器选项如-frtti且基类需至少含一个虚函数。四、多态的应用模式1.工厂模式class Button { public: virtual void render() 0; }; class WindowsButton : public Button { /*...*/ }; Button* createButton(const std::string osType) { if (osType Windows) return new WindowsButton(); // 其他类型分支... }2.代理模式class Image { public: virtual void display() 0; }; class RealImage : public Image { public: void display() override { /* 实际加载 */ } }; class ProxyImage : public Image { public: void display() override { if (!realImage) realImage new RealImage(); realImage-display(); } private: RealImage* realImage nullptr; };五、深入理解虚函数表vTable概念模型简化表示vTable_Animal [Animal::speak地址, Animal::~Animal地址] vTable_Dog [Dog::speak地址, Animal::~Animal地址]当调用animal-speak()时通过对象指针访问虚函数表查表定位函数实际地址跳转执行六、多态的内存布局示例Animal* animals[] {new Dog(), new Cat()}; for (auto* a : animals) { a-speak(); delete a; // 正确调用派生类析构 }输出Woof! Meow!注意事项虚析构必要性若基类指针可能删除派生类对象必须声明虚析构override关键字C11引入的语法检查机制性能考量虚函数调用比普通函数多一次指针跳转通过系统利用虚函数和继承机制可构建高度扩展的面向对象系统。