继承、多态与虚函数
代码复用与运行时绑定
继承让派生类获得基类的成员;多态让同一接口在不同对象上表现出不同行为。C++ 通过virtual虚函数实现运行时多态。
一、继承基础
1.1 语法
#include<iostream>#include<string>classPerson{protected:std::string name;intage;public:Person(conststd::string&n,inta):name(n),age(a){}voidshowInfo()const{std::cout<<name<<", "<<age<<" 岁"<<std::endl;}};classStudent:publicPerson{private:std::string studentId;public:Student(conststd::string&n,inta,conststd::string&id):Person(n,a),studentId(id){}voidshowInfo()const{Person::showInfo();std::cout<<"学号:"<<studentId<<std::endl;}};intmain(){Students("李四",20,"2024001");s.showInfo();return0;}1.2 继承方式
| 方式 | 含义 |
|---|---|
public继承 | 最常用,is-a 关系 |
protected继承 | 较少用 |
private继承 | 实现继承,较少用 |
二、访问控制与继承
| 基类成员 | public 继承 | protected 继承 | private 继承 |
|---|---|---|---|
| public | public | protected | private |
| protected | protected | protected | private |
| private | 不可访问 | 不可访问 | 不可访问 |
派生类可访问基类的public和protected成员。
三、虚函数与多态
3.1 问题:非虚函数
classAnimal{public:voidspeak(){std::cout<<"..."<<std::endl;}};classDog:publicAnimal{public:voidspeak(){std::cout<<"汪汪!"<<std::endl;}};Animal*p=newDog();p->speak();// 输出 "..." — 非多态!deletep;3.2 虚函数解决
classAnimal{public:virtualvoidspeak(){std::cout<<"..."<<std::endl;}virtual~Animal(){}// 虚析构,多态删除时必须};classDog:publicAnimal{public:voidspeak()override{std::cout<<"汪汪!"<<std::endl;}};Animal*p=newDog();p->speak();// 输出 "汪汪!" — 多态!deletep;virtual:通过基类指针/引用调用时,根据实际对象类型决定调用哪个版本。
3.3 override 与 final(C++11)
voidspeak()override;// 显式标记重写voidspeak()final;// 禁止进一步重写四、纯虚函数与抽象类
含纯虚函数的类为抽象类,不能实例化:
classShape{public:virtualdoublearea()const=0;// 纯虚函数virtual~Shape()=default;};classCircle:publicShape{doubleradius;public:Circle(doubler):radius(r){}doublearea()constoverride{return3.14159*radius*radius;}};五、多态的应用
voidprintArea(constShape&s){std::cout<<"面积:"<<s.area()<<std::endl;}Circlec(5);Rectangler(3,4);printArea(c);// 圆面积printArea(r);// 矩形面积同一函数printArea处理不同形状,体现多态。
六、实战练习
练习1:继承层次
定义Vehicle基类,Car和Bicycle派生类,各自实现move()。
练习2:虚函数多态
定义Employee基类(虚函数salary()),Manager和Developer派生类重写。
练习3:抽象类
定义抽象类Animal,派生Cat、Dog,用基类指针数组调用speak()。
七、总结与延伸
本节重点回顾
- 继承:
class Derived : public Base - virtual实现运行时多态;基类指针调用派生类方法
- override标记重写;纯虚函数
= 0定义抽象类 - 多态基类需虚析构函数
下节预告
下一篇:《模板与 STL 基础》。
延伸阅读
- C++ 速查 §9 继承与多态
📌知识点卡片
- 继承:class D : public B;
- virtual void f(); override;
- 纯虚:virtual void f() = 0;
- 多态基类:virtual ~Base() {}
下一篇见!