多态
1、概念的概念
通俗来讲,就是多种形态。具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
例子:新用户 领红包 99
老用户 领红包 2
不常用 领红包 6
符合多态条件:
#include <iostream>
using namespace std;
class Person
{
public:
virtual void BuyTicket()
{
cout << "买票-全价" << endl;
}
};
class Student : public Person
{
public:
//虚函数的重写/覆盖。:三同(函数名、参数、返回值)
//不符合重写就是隐藏关系
virtual void BuyTicket()
{
cout << "买票-半价" << endl;
}
};
class Soldier : public Person
{
public:
virtual void BuyTicket()
{
cout << "优先买票" << endl;
}
};
//多态两个条件:
//1、虚函数重写
//2、父类的指针或者引用去调用虚函数。
void Func(Person& p)
{
p.BuyTicket();
}
int main()
{
Person ps;
Student st;
Soldier sd;
Func(ps);
Func(st);
Func(sd);
return 0;
}
以下例题:输出是什么?
class A
{
public:
virtual void func(int val = 1)
{
std::cout << "A->" << std::endl;
}
virtual void test() {
func();
}
};
class B : public A
{
public:
void func(int val = 0) {
std::cout << "B->" << val << std::endl;
}
};
int main()
{
B* p = new B;
p->test();
return 0;
}
虚函数重写是接口继承,重写实现
普通函数继承是实现继承
也就是说,在调用A中test执行 func的时候,参数使用的是A中的,而函数的实现使用的B中的func.
总结:多态的本质原理,符合多态的两个条件,那么调用时,会指到对象的虚表中找到对应的虚函数地址,进行调用。
多态调用:程序运行时去指向对象的虚表中找到函数的地址,进行调用。
普通函数的调用:编译或连接时确定函数的地址。运行时直接调用。