C++学习多态和虚函数

  • 默认情况下,编译器只会根据指针类型调用对应的函数,不存在多态
  • 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的结果
  • 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值