在C++中,类的继承是一种面向对象编程(OOP)的重要特性,它允许一个类(子类或派生类)继承另一个类(基类或父类)的属性和方法。通过继承,可以重用现有的代码,减少重复代码,提高代码的可维护性和扩展性。
1. 基本概念
- 基类(Base Class 或 Parent Class):被继承的类。
- 派生类(Derived Class 或 Child Class):从基类继承的类。
2. 继承的语法
在C++中,使用冒号 : 来表示继承关系,并指定继承方式。继承方式有三种:
- 公有继承(public):基类的公有成员和保护成员在派生类中保持原来的访问级别。
- 私有继承(private):基类的公有成员和保护成员在派生类中变为私有成员。
- 保护继承(protected):基类的公有成员和保护成员在派生类中变为保护成员。
class DerivedClass : access_specifier BaseClass {
// 派生类的成员
};
其中 access_specifier 可以是 public、private 或 protected。
3. 示例
假设我们有一个基类 Animal,它有一些基本的属性和方法。然后我们定义一个派生类 Dog,它继承自 Animal 并添加了一些新的特性和方法。
#include <iostream>
using namespace std;
// 基类
class Animal {
protected:
string name;
int age;
public:
Animal(string n, int a) : name(n), age(a) {}
void eat() const {
cout << name << " is eating." << endl;
}
virtual void makeSound() const {
cout << "Some generic animal sound" << endl;
}
virtual ~Animal() {} // 虚析构函数,确保派生类的析构函数被正确调用
};
// 派生类
class Dog : public Animal {
public:
Dog(string n, int a) : Animal(n, a) {}
void makeSound() const override {
cout << name << " barks: Woof!" << endl;
}
void fetch() const {
cout << name << " is fetching the ball." << endl;
}
};
int main() {
Animal animal("Generic Animal", 5);
Dog dog("Rex", 3);
animal.eat();
animal.makeSound();
dog.eat();
dog.makeSound();
dog.fetch();
return 0;
}
- 解释
- 基类 Animal:
包含两个受保护的成员变量 name 和 age。
包含一个构造函数,用于初始化成员变量。
包含一个 eat 方法和一个虚方法 makeSound。
包含一个虚析构函数,确保派生类的析构函数被正确调用。 - 派生类 Dog:
使用公有继承 public 继承自 Animal。
包含一个构造函数,调用基类的构造函数来初始化继承的成员变量。
重写了基类的 makeSound 方法,提供特定于狗的行为。
添加了一个新的方法 fetch,这是狗特有的行为。 - 主函数 main:
创建了一个 Animal 对象和一个 Dog 对象。
调用 Animal 对象的方法,展示通用动物的行为。
调用 Dog 对象的方法,展示狗的特定行为。
- 基类 Animal:
- 重要概念
- 虚函数(Virtual Function):
在基类中声明为 virtual 的函数可以在派生类中被重写(覆盖)。当通过基类指针或引用调用虚函数时,实际调用的是派生类中的版本。
虚析构函数确保派生类的析构函数被正确调用,防止资源泄漏。 - 多态(Polymorphism):
多态允许基类指针或引用来调用派生类的方法。这是通过虚函数实现的。
例如,可以将 Dog 对象赋值给 Animal 类型的指针或引用,并调用 makeSound 方法,实际调用的是 Dog 类中的 makeSound 方法。
- 虚函数(Virtual Function):
- 运行结果:
通过继承,可以构建层次化的类结构,提高代码的复用性和可维护性。类的继承是C++中实现代码复用和扩展的强大工具,但也需要仔细设计以避免复杂的继承关系和潜在的问题。
标签:调用,继承,派生类,Dog,C++,Animal,基类 From: https://blog.csdn.net/u011732210/article/details/143843904