联系方式
学习资讯
C++多态和虚函数快速入门教程
C++多态和虚函数入门教程
在《C++将派生类赋值给基类(向上转型)》一节中讲到,基类的指针也可以指向派生类对象,请看下面的例子:
- #include <iostream>
- using namespace std;
- //基类People
- class People{
- public:
- People(char *name, int age);
- void display();
- protected:
- char *m_name;
- int m_age;
- };
- People::People(char *name, int age): m_name(name), m_age(age){}
- void People::display(){
- cout<<m_name<<"今年"<<m_age<<"岁了,是个无业游民。"<<endl;
- }
- //派生类Teacher
- class Teacher: public People{
- public:
- Teacher(char *name, int age, int salary);
- void display();
- private:
- int m_salary;
- };
- Teacher::Teacher(char *name, int age, int salary): People(name, age), m_salary(salary){}
- void Teacher::display(){
- cout<<m_name<<"今年"<<m_age<<"岁了,是一名教师,每月有"<<m_salary<<"元的收入。"<<endl;
- }
- int main(){
- People *p = new People("王志刚", 23);
- p -> display();
- p = new Teacher("赵宏佳", 45, 8200);
- p -> display();
- return 0;
- }
王志刚今年23岁了,是个无业游民。
赵宏佳今年45岁了,是个无业游民。
我们直观上认为,如果指针指向了派生类对象,那么就应该使用派生类的成员变量和成员函数,这符合人们的思维习惯。但是本例的运行结果却告诉我们,当基类指针 p 指向派生类 Teacher 的对象时,虽然使用了 Teacher 的成员变量,但是却没有使用它的成员函数,导致输出结果不伦不类(赵宏佳本来是一名老师,输出结果却显示人家是个无业游民),不符合我们的预期。
换句话说,通过基类指针只能访问派生类的成员变量,但是不能访问派生类的成员函数。
为了消除这种尴尬,让基类指针能够访问派生类的成员函数,C++ 增加了虚函数(Virtual Function)。使用虚函数非常简单,只需要在函数声明前面增加 virtual 关键字。
更改上面的代码,将 display() 声明为虚函数:
纯文本复制
- #include <iostream>
- using namespace std;
- //基类People
- class People{
- public:
- People(char *name, int age);
- virtual void display(); //声明为虚函数
- protected:
- char *m_name;
- int m_age;
- };
- People::People(char *name, int age): m_name(name), m_age(age){}
- void People::display(){
- cout<<m_name<<"今年"<<m_age<<"岁了,是个无业游民。"<<endl;
- }
- //派生类Teacher
- class Teacher: public People{
- public:
- Teacher(char *name, int age, int salary);
- virtual void display(); //声明为虚函数
- private:
- int m_salary;
- };
- Teacher::Teacher(char *name, int age, int salary): People(name, age), m_salary(salary){}
- void Teacher::display(){
- cout<<m_name<<"今年"<<m_age<<"岁了,是一名教师,每月有"<<m_salary<<"元的收入。"<<endl;
- }
- int main(){
- People *p = new People("王志刚", 23);
- p -> display();
- p = new Teacher("赵宏佳", 45, 8200);
- p -> display();
- return 0;
更多培训课程,学习资讯,课程优惠等学校信息,请进入 重庆达内教育重庆软件测试培训重庆C语言培训 网站详细了解,免费咨询电话:400-998-6158