C++多态性与虚函数定义注意事项
学习笔记,主要来源为《C++从入门到精通》,
1. 多态性
基类指针可以调用基类的成员变量或者成员函数,也可以调用继承类的成员变量或者成员函数,这种多形态多种表现方式称为多态性。
C++提供多态性,可以通过基类指针实现对所有派生类(包括直接派生和间接派生)的成员变量和成员函数进行“全方位”的访问,尤其是成员函数。如没有多态性,只能访问成员变量。
2.虚函数
要在C++中实现多态性,成员函数必须是虚函数。虚函数使用非常简单,只需要在函数声明前加是virtual关键字即可。
结合代码来描述简单一点,使用VS Code完成代码编写和运行,如下
#include<iostream>
using namespace std;
//基类Worker
class Worker
{
protected:
char *name;
int age;
public:
//基类构造函数
Worker(char *wname, int wage ):name(wname), age(wage)
/*wname(name), wage(age)参数列表,也可在{}内表示为:
name = Wnme; age = wage; */
{
//构造函数的参数列表
}
//虚函数声明
virtual void myshow()
{
cout<< "我的名字是" << name << ",年龄是" << age <<endl;
}
};
//派生类People声明
class People : public Worker //public为寄生方式
{
public:
People(char *pname, int page): Worker(name , age)
{
//构造函数参数列表
name = pname;
age = page;
}
//虚函数声明,命名与基类Worker相同
virtual void myshow()
{
cout<< "我叫"<< name << ",今年" << age <<"岁,请多多关照"<<endl;
}
};
int main()
{
Worker *pw = new Worker ("李亮", 25); //new Worker 必不可少
pw->myshow();
pw = new People("万明", 22); //new People必不可少
pw->myshow();
}
输出结果如下,由结果可知,…
3.虚函数定义注意事项
(1) 函数声明与函数定义分开时,只需要在声明处加上virtual关键字即可。
(2)派生类中成员函数对基类中同名函数具有覆盖性,可以只将基类中的函数声明为虚函数。
(3)当基类中定义了虚函数,而派生类中没有定义新的函数来覆盖此函数,那么将直接使用基类的虚函数。
(4)只有派生类的虚函数覆盖基类的虚函数才能构成多态性,既通过指针访问派生类函数。
(5)构造函数不可以声明为虚函数。
此外还有纯虚函数,用于实现基类定义虚函数是不能给其赋予实际意义,以便于在派生类中重新定义该函数的,其语法格式为;
virtual 返回值类型 函数名 (函数参数) = 0 ;
其中“=0 ”只是告诉编译系统这是一个纯虚函数。
接口即为包含纯虚函数的类,也称为抽象类。目的是为其他类提供一个可以继承的适当的基类。注意抽象类不能用用来实例化对象,会产生编译错误。