联系方式

咨询热线:400-998-6158

点击此处免费预约试听课程»

常见问题
学习资讯
学习资讯

C++多态和虚函数快速入门教程

C++多态和虚函数入门教程

在《C++将派生类赋值给基类(向上转型)》一节中讲到,基类的指针也可以指向派生类对象,请看下面的例子:

		
  1. #include <iostream>
  2. using namespace std;
  3. //基类People
  4. class People{
  5. public:
  6. People(char *name, int age);
  7. void display();
  8. protected:
  9. char *m_name;
  10. int m_age;
  11. };
  12. People::People(char *name, int age): m_name(name), m_age(age){}
  13. void People::display(){
  14. cout<<m_name<<"今年"<<m_age<<"岁了,是个无业游民。"<<endl;
  15. }
  16. //派生类Teacher
  17. class Teacher: public People{
  18. public:
  19. Teacher(char *name, int age, int salary);
  20. void display();
  21. private:
  22. int m_salary;
  23. };
  24. Teacher::Teacher(char *name, int age, int salary): People(name, age), m_salary(salary){}
  25. void Teacher::display(){
  26. cout<<m_name<<"今年"<<m_age<<"岁了,是一名教师,每月有"<<m_salary<<"元的收入。"<<endl;
  27. }
  28. int main(){
  29. People *p = new People("王志刚", 23);
  30. p -> display();
  31. p = new Teacher("赵宏佳", 45, 8200);
  32. p -> display();
  33. return 0;
  34. }
运行结果:
王志刚今年23岁了,是个无业游民。
赵宏佳今年45岁了,是个无业游民。

我们直观上认为,如果指针指向了派生类对象,那么就应该使用派生类的成员变量和成员函数,这符合人们的思维习惯。但是本例的运行结果却告诉我们,当基类指针 p 指向派生类 Teacher 的对象时,虽然使用了 Teacher 的成员变量,但是却没有使用它的成员函数,导致输出结果不伦不类(赵宏佳本来是一名老师,输出结果却显示人家是个无业游民),不符合我们的预期。

换句话说,通过基类指针只能访问派生类的成员变量,但是不能访问派生类的成员函数。

为了消除这种尴尬,让基类指针能够访问派生类的成员函数,C++ 增加了虚函数(Virtual Function)。使用虚函数非常简单,只需要在函数声明前面增加 virtual 关键字。

更改上面的代码,将 display() 声明为虚函数:
纯文本复制
		
  1. #include <iostream>
  2. using namespace std;
  3. //基类People
  4. class People{
  5. public:
  6. People(char *name, int age);
  7. virtual void display(); //声明为虚函数
  8. protected:
  9. char *m_name;
  10. int m_age;
  11. };
  12. People::People(char *name, int age): m_name(name), m_age(age){}
  13. void People::display(){
  14. cout<<m_name<<"今年"<<m_age<<"岁了,是个无业游民。"<<endl;
  15. }
  16. //派生类Teacher
  17. class Teacher: public People{
  18. public:
  19. Teacher(char *name, int age, int salary);
  20. virtual void display(); //声明为虚函数
  21. private:
  22. int m_salary;
  23. };
  24. Teacher::Teacher(char *name, int age, int salary): People(name, age), m_salary(salary){}
  25. void Teacher::display(){
  26. cout<<m_name<<"今年"<<m_age<<"岁了,是一名教师,每月有"<<m_salary<<"元的收入。"<<endl;
  27. }
  28. int main(){
  29. People *p = new People("王志刚", 23);
  30. p -> display();
  31. p = new Teacher("赵宏佳", 45, 8200);
  32. p -> display();
  33. return 0;
学校联系方式

更多培训课程,学习资讯,课程优惠等学校信息,请进入 重庆达内教育重庆软件测试培训重庆C语言培训 网站详细了解,免费咨询电话:400-998-6158

相关课程