各位好友, 本期__正式进入 --->继承下,多态 ,下面进入开战 环节 !
-------->多态 :>不同的对象, 进行某些行为的时候, 会产生不一样的状态 。
如 , 购买火车票, 学生可以购买到 优惠的火车票(含折扣);而 普通人 只能购买到 全价票 。
-------->代码实现 :>
//多态展现
//
#include <iostream>
using std :: cout;
using std :: endl;
class Person
{
public:
virtual void _BuyTickuet() const {cout << "全价火车票" << endl;}
};
class Student : public Person
{
public:
virtual void _BuyTicket() const {cout << "半价位火车票" << endl;}
};
void Func(const Person& p)
{
p._BuyTicket();
}
int main()
{
Func(Person());
Func(Student());
return 0;
}
为了方便好友们, 有更好的观感体验, 现附上 彩色 代码图样 :>
--------->NO 1.
--------->上述代码,不加上 “ Virtual ” 就只是 普通调用,即,对象是什么就会去调用什么 ;
--------->NO 2.
------->解析环节 :>
(1). 上述代码 P 发生了切片行为, 从而可以指向 基类 ~~ 派生类 ;
(2). 注意 :>
----->多态, 不同对象传递过去, 会去调用不同的函数 ;
----->多态调用/看__指向当前的对象 ; 而 普通对象, 只看__当前的类型 ;
(3). 多态条件 :>
a . 调用函数是重写的虚函数 ; b . 必须是 基类的指针 或者 引用 ;
--------->探究__多态条件 :>
--------->NO a.
//探究多态条件
//基类成员函数 不再是 虚函数
class person
{
public:
void _BuyTiucket() const {cout << "全价火车票" << endl;}
};
class Student
{
public:
virtual void _BuyTicket() const {cout << "半价火车票" << endl;}
};
void Func(const Person& p)
{
p._BuyTicket();
}
int main()
{
Func(Person());
Func(Student());
return 0;
}
--------->NO b.
//探究多态条件
//
class person
{
public:
virtual void _BuyTiucket() const {cout << "全价火车票" << endl;}
};
class Student
{
public:
virtual void _BuyTicket() const {cout << "半价火车票" << endl;}
};
void Func(const Person p)
{
p._BuyTicket();
}
int main()
{
Func(Person());
Func(Student());
return 0;
}
为了方便好友们, 有更好的观感体验, 现附上 彩色 代码图样 :>
------->NO a.
------->NO b .
各位好友, 上述推演过程 ,还涉及 虚函数的重写 !下面展现 重写相关知识 :>
(1). 虚函数重写(覆盖):派生类中有一个跟基类完全相同的虚函数, 即, 符合 “三同”
------->函数名相同, 参数列表相同 , 返回值相同 (大前提条件)
------->NO 1.
------->NO 2.
(2). 虚函数重写 --->两个例外 :>
a . 协变(基类 ~~ 派生类 --->返回值类型可以不相同)
派生类重写虚函数/时候, 与基类虚函数返回值类型可以不同 ;即,基类虚函数返回基类对象的指针 ~~ 引用 ;
派生类虚函数返回派生类对象的指针 ~~ 引用 , 称其为 协变 。
------->NO 1.
------->NO 2.
------->NO 3.
-------->错误示例 :>
b . 析构函数重写(基类 ~~ 派生类 --->析构函数名字不同)
如果,基类的析构函数为虚函数,派生类的析构函数即使名字不一样, 也无论是否添加上 “Virtual”关键字
都可与基类的析构函数构成重写 ;其实, 在底层汇编方面, 编译器对析构函数名称做了特殊处理, 编译之后,
析构函数统一处理成 “Destructor” 。
-------->代码演示 :>
-------->NO 1.
//析构推演
//
#include <iostream>
using std :: cout;
using std :: endl;
class Person
{
public:
virtual void _BuyTicket() {cout << "全价火车票" << endl;}
~Person() {cout << "~Person()" << endl;}
};
class Student : public Person
{
public:
virtual void _BuyTicket() {cout << "半价火车票" << endl;}
~Student()
{
cout << "~Student()" << endl << endl;
delete _ptr;
}
protected:
int* _ptr;
};
void Func(const Person& p)
{
p._BuyTicket();
}
int main()
{
Func(Student());
Func(Person());
return 0;
}
-------->NO a.
-------->NO 2.
//析构推演
//
#include <iostream>
using std :: cout;
using std :: endl;
class Person
{
public:
virtual void _BuyTicket() {cout << "全价火车票" << endl;}
~Person() {cout << "~Person()" << endl;}
};
class Student : public Person
{
public:
virtual void _BuyTicket() {cout << "半价火车票" << endl;}
~Student()
{
cout << "~Student()" << endl << endl;
delete _ptr;
}
protected:
int* _ptr;
};
void Func(const Person& p)
{
p._BuyTicket();
}
int main()
{
Func(Student());
Func(Person());
return 0;
}
-------->NO b.
-------->解析环节 :>
-------->反汇编 :>
---------->多态下, 析构推演 :>
-------->解析环节 :>
各位好友, 本期内容 已完结 !
下一期, 继续推进, 继承下, 多态 ! “敬请期待 !😊😊