【C++】——多态(上)

06-02 1677阅读

【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,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码