C++ 【多态】

继承中要构成多态的条件,多态注意事项,多态的原理,虚表指针,多态的本质原理,析构函数的重写,C++11 override,抽象类,多继承,多态常考题
摘要由CSDN通过智能技术生成

目录

继承中要构成多态的条件(两个条件必须同时满足)

多态注意事项

 多态的原理

虚表指针

多态的本质原理是:

析构函数的重写

C++11 override

抽象类

写一个函数打印虚表

多继承

多态常考题


多态概念

完成某个行为,不同的对象去完成时会产生出不同的状态,称为多态。例如抢红包场景,不同的用户抢到金额大小不一样的红包

多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。

继承中要构成多态的条件(两个条件必须同时满足)

1. 派生类必须对基类的虚函数进行重写

(重写的条件是:被调用的函数必须是虚函数、还有函数名,返回值,参数必须相同才能构成虚函数,不符合重写就是隐藏关系,既不构成多态)

重载:两个函数在同一作用域、参数/函数名相同

重写(覆盖):两个函数分别在基类和派生类的作用域、参数/函数名/返回值必须相同、必须是虚函数

重定义(隐藏):函数名相同、两个函数分别在基类和派生类的作用域、不是重写就是重定义

2. 必须通过基类的指针或者引用调用虚函数

不同人买票不同价格:
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;
	}
};

void fun(Person& p)//必须通过基类的指针或者引用调用虚函数
                   //这时候跟p的类型无关,而是看指针or引用指向的对象
{
	p.BuyTicket();
}

 

不构成多态

多态注意事项

1.只有成员函数才能加virtual,全局函数无法加virtual

2.基类加virtual,子类不加virtual,只要子类符合三同和重写,也符合多态(不要这么做,默认加上)

3.返回值可以不同,但是要求必须是父子关系的指针或者引用(只要属于父子类型的指针或引用都可以,不能颠倒关系),称为协变

符合协变
只要是父子类型的指针或引用都可以

不能颠倒,父是父,子是子

以下程序输出结果是什么?

class A
{
public:
    virtual void func(int val = 1) { std::cout << "A->" << val << std::endl; }
    virtual void test() { func(); }
   };

class B : public A
{
public:
    void func(int val = 0) { std::cout << "B->" << val << std::endl; }
};

int main(int argc, char* argv[])
{
    B* p = new B;
    p->test();
    return 0;
}

A: A->0      B: B->1       C: A->1       D: B->0      E: 编译出错         F: 以上都不正确

解答:

首先p->test没有构成多态,A中的test传参A* this调用func,构成多态条件,调用了B类中的func:B->,其中虚函数重写是一个

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北方留意尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值