- 默认情况下,编译器只会根据指针类型调用对应的函数,不存在多态
- 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的结果
- C++中,多态通过虚函数来实现
- 虚函数:被virtual修饰的成员函数
- 只要在父类中声明为虚函数,子类中重写的函数也自动变为虚函数(子类中可以省略virtual关键字)
多态的要素:
- 子类重写父类的成员函数(成员函数为虚函数)
- 父类指针指向子类对象
- 利用父类指针调用重写的成员函数
#include<iostream>
using namespace std;
//class Person{
//public:
// int m_age;
//};
//
//class Student :public Person{
//public:
// int m_score;
//};
struct Animal{
virtual void speak() {
cout << "Animal::speak()" << endl;
}
virtual void run() {
cout << "Animal::run()" << endl;
}
};
struct Dog :Animal{
void speak() {
cout << "Dog::speak()" << endl;
}
void run() {
cout << "Dog::run()" << endl;
}
};
struct Cat :Animal{
void speak() {
cout << "Cat::speak()" << endl;
}
void run() {
cout << "Cat::run()" << endl;
}
};
struct Pig :Animal{
void speak() {
cout << "Pig::speak()" << endl;
}
void run() {
cout << "Pig::run()" << endl;
}
};
//void liu(Dog *p) {
// p->speak();
// p->run();
//}
//void liu(Cat *p) {
// p->speak();
// p->run();
//}
//void liu(Pig *p) {
// p->speak();
// p->run();
//}
void liu(Animal *p) {
p->speak();
p->run();
}
int main() {
//Student student;
//Student *p = new Student();
//父类指针指向子类对象
//Person *p = new Student();
//子类指向父类
//Student *p = (Student *)new Person();//比较危险
liu(new Dog());
liu(new Cat());
liu(new Pig());
getchar();
return 0;
}