【C++】——多态(上)
【C++】——多态(上)
- 1 多态的概念
- 2 多态的定义及实现
- 2.1 多态的构成条件
- 2.1.1 实现多态的必要条件
- 2.1.2 虚函数
- 2.1.3 感受多态
- 2.1.4 判断是否满足多态
- 2.1.5 多态场景的一道选择题
- 2.1.6 虚函数重写的一些其他问题
- 2.1.6.1 协变
- 2.1.6.2 析构函数的重写
- 2.1.7 override 和 final 关键字
- 2.1.8 重载/重写/隐藏的对比重载
- 3 纯虚函数和抽象类
1 多态的概念
多态的概念:通俗来说,多态就是多种形态。多态分为静态多态(编译时的多态)和动态多态(运行时多态)。本章我们重点介绍运行时多态。
编译时多态(静态多态) 主要就是我们前面学习的函数重载和函数模板,他们传不同类型的参数就可以调用不同的函数,通过参数不同达到多种形态。之所以叫编译时多态,是因为他们实参传给形参的参数匹配是在编译时完成的,我们把编译时一般归为静态,运行时归为动态
比如:
int i; double d; cout public: virtual void BuyTicket() { cout public: virtual void BuyTicket() { cout // 这⾥可以看到虽然都是Person指针Ptr在调用BuyTicket // 但是跟ptr没关系,⽽是由ptr指向的对象决定的。 ptr-BuyTicket(); } int main() { Person ps; Student st; Func(&ps); Func(&st); return 0; } public: virtual void talk() const {} }; class Dog : public Animal { public: virtual void talk() const { std::cout public: virtual void talk() const { std::cout animal.talk(); } int main() { Cat cat; Dog dog; letsHear(cat); letsHear(dog); return 0; } public: void BuyTicket() { cout public: virtual void BuyTicket() { cout public: virtual void BuyTicket() { cout public: virtual void BuyTicket() { cout ptr-BuyTicket() } public: virtual void talk() const {} }; class Dog : public Animal { public: virtual void talk() const { std::cout public: virtual void talk() const { std::cout Cat* pcat = new Cat; Dog* pdog = new Dog; pcat-talk(); pdog-talk(); return 0; } public: virtual void BuyTicket() { cout public: virtual void BuyTicket() { cout ptr-BuyTicket(); } public: virtual void BuyTicket() { cout public: void BuyTicket() { cout // 这⾥可以看到虽然都是Person指针Ptr在调⽤BuyTicket // 但是跟ptr没关系,⽽是由ptr指向的对象决定的。 ptr-BuyTicket(); } public: virtual void func(int val = 1) { std::cout func(); } }; class B : public A { public: void func(int val = 0) { std::cout B* p = new B; p-test(); return 0; } B* p = new B; p-func(); return 0; } }; class B : public A {}; class Person { public: virtual A* BuyTicket() { cout public: virtual B* BuyTicket() { cout ptr-BuyTicket(); } int main() { Person ps; Student st; Func(&ps); Func(&st); return 0; } public : virtual ~A() { cout public: ~B() { cout A* p1 = new A; A* p2 = new B; delete p1; delete p2; return 0 } public : ~A() { cout public: ~B() { cout A* p1 = new A; A* p2 = new B; delete p1; delete p2; return 0; } public: virtual void Dirve() {} }; class Benz :public Car { public: virtual void Drive() override{ cout return 0; } public: virtual void Dirve() final {} }; class Benz :public Car { public: virtual void Dirve() { cout return 0; } public: virtual void talk() const = 0; }; class Cat : public Animal { public: virtual void talk() const { std::cout public: virtual void talk() const { std::cout Animal* pCat = new Cat; Animal* pDog = new Dog; pCat-talk(); pDog-talk(); return 0; } Animal animal; return 0; } public : virtual void Drive() = 0; }; class Benz :public Car { }; public : virtual void Drive() = 0; }; class Benz :public Car { public : virtual void Drive() { cout public : virtual void Drive() { cout
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。