继承使子类复用父类成员,多态通过虚函数实现运行时动态绑定;示例中Animal为基类,Dog和Cat继承并重写makeSound,通过基类指针调用实现不同行为。

在C++中,继承和多态是面向对象编程的两个核心特性。通过继承,子类可以复用父类的成员变量和方法;通过多态,可以在运行时根据对象的实际类型调用对应的函数。下面通过一个简单示例说明如何实现。
1. 继承的基本实现
继承允许一个类(派生类)获取另一个类(基类)的属性和方法。使用冒号 : 来指定继承关系。
class Animal {public:
void eat() {
cout }
virtual void makeSound() {
cout }
};
class Dog : public Animal {
public:
void makeSound() override {
cout }
};
class Cat : public Animal {
public:
void makeSound() override {
cout }
};
2. 多态的实现方式
多态依赖于虚函数和指针或引用。将基类中的函数声明为 virtual,在派生类中重写该函数,再通过基类指针或引用调用,就能实现运行时多态。
int main() {Animal* animal1 = new Dog();
Animal* animal2 = new Cat();
animal1->makeSound(); // 输出: Dog barks: Woof!
animal2->makeSound(); // 输出: Cat meows: Meow!
delete animal1;
delete animal2;
return 0;
}
3. 关键点说明
- 基类中需要将希望被重写的函数声明为 virtual,否则无法实现动态绑定。
- 使用 override 关键字明确表示重写虚函数,有助于编译器检查错误。
- 多态只能通过指针或引用触发,直接定义对象调用不会体现多态行为。
- 若基类有虚函数,建议定义虚析构函数,防止内存泄漏。
4. 完整示例代码
把上面所有部分组合起来:
立即学习“C++免费学习笔记(深入)”;
#include iostream>using namespace std;
class Animal {
public:
virtual void makeSound() {
cout }
virtual ~Animal() = default; // 虚析构函数
};
class Dog : public Animal {
public:
void makeSound() override {
cout }
};
class Cat : public Animal {
public:
void makeSound() override {
cout }
};
int main() {
Animal* pets[] = {new Dog(), new Cat()};
for(int i = 0; i pets[i]->makeSound();
}
for(int i = 0; i delete pets[i];
}
return 0;
}
基本上就这些。理解虚函数表和动态绑定机制能更深入掌握多态底层原理,但在日常开发中,按上述模式使用已足够应对大多数场景。注意设计基类接口时要合理,避免过度继承。不复杂但容易忽略的是虚析构函数和 override 的使用。











