- 虚函数注意事项
-
只需在虚函数的声明处加上virtual关键字,函数定义处可以加也可以不加
-
可以只将基类中的函数声明为虚函数,这样派生类中具有遮蔽关系的同名函数都将自动成为虚函数。
-
当基类中定义了虚函数,如果派生类没有定义新的函数来遮蔽此函数,那么将使用基类的虚函数。
-
构造函数不能是虚函数。对于基类的构造函数,它仅仅是在派生类构造函数中被调用,这种机制不同于继承。
-
析构函数可以声明为虚函数,而且有时候必须声明为虚函数。
/*当基类中定义了虚函数,如果派生类没有定义新的函数来遮蔽此函数,那么将使用基类的虚函数。*/ #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; }
-
/运行结果:/
王志刚今年23岁了,是个无业游民。
赵宏佳今年45岁了,是个无业游民。
- 构成多态的条件
- 继承:必须存在继承关系
- 重写:子类重写了父类的方法
- 指针:存在基类的指针,通过改指针调用虚函数