自学内容网 自学内容网

多态相关问题

多态

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.

总结:多态的本质原理,符合多态的两个条件,那么调用时,会指到对象的虚表中找到对应的虚函数地址,进行调用。
多态调用:程序运行时去指向对象的虚表中找到函数的地址,进行调用。
普通函数的调用:编译或连接时确定函数的地址。运行时直接调用。


原文地址:https://blog.csdn.net/LIHONGLI000125/article/details/142329721

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!