【C++深度探索】全面解析多态性机制(一)

07-12 1137阅读

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹

【C++深度探索】全面解析多态性机制(一)

💥个人主页:大耳朵土土垚的博客

💥 所属专栏:C++入门至进阶

这里将会不定期更新有关C++的内容,欢迎大家多多点赞关注收藏💖💖

目录

  • 1.什么是多态
  • 2.虚函数的定义与重写
  • 3.多态的实现
  • 4.虚函数重写的两个例外
  • 5.C++11 override 和 final
  • 6.重载、覆盖(重写)、隐藏(重定义)的对比
  • 7.抽象类
  • 8.结语

    1.什么是多态

    在C++中,多态(Polymorphism)是指通过基类指针或引用来访问派生类对象的一种机制。简单来说,它允许我们在基类类型的指针或引用上调用派生类对象的成员函数。

    通俗来说,就是多种形态,或者说完成某个行为时,当不同的对象去完成会产生出不同的状态。

    例如:买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。不同的对象去完成同一个行为——买票,会产生不同的状态。

    在代码中的具体体现则依赖于虚函数(Virtual Function)。在基类中,可以将某个成员函数声明为虚函数,而在派生类中重写该函数。通过使用基类指针或引用指向派生类对象,并调用该虚函数,实际上在运行时会根据对象的实际类型调用合适的函数。

    2.虚函数的定义与重写

    虚函数:即被virtual修饰的类成员函数称为虚函数

    class Person {
    public:
    	//虚函数
    	virtual void BuyTicket() { cout 
    public:
    //虚函数
     virtual void BuyTicket() { cout 
    public:
    //虚函数重写
     virtual void BuyTicket() { cout 
    public:
    	virtual void BuyTicket() { cout 
    public:
    //条件二:调用的是虚函数并且派生类对虚函数进行重写
    	virtual void BuyTicket() { cout 
    //条件一:基类的引用或指针调用虚函数
    	p.BuyTicket();
    }
    int main()
    {
    	Person ps;
    	Student st;
    	Func(ps);
    	Func(st);
    	return 0;
    }
    };
    class B : public A {};
    class Person {
    public:
    	virtual A* f() { return new A; }//基类虚函数返回值类型为基类指针或引用
    };
    class Student : public Person {
    public:
    	virtual B* f() { return new B; }//派生类虚函数返回值类型为派生类指针或引用
    };
    
    public:
    	virtual Person* f() { return new Person; }//基类虚函数返回值类型为基类指针或引用
    };
    class Student : public Person {
    public:
    	virtual Student* f() { return new Student; }//派生类虚函数返回值类型为派生类指针或引用
    };
    
    public:
    	virtual ~Person() { cout 
    public:
    //构成多态条件二:基类虚函数并且派生类虚函数重写
    	virtual ~Student() { cout 
    //构成多态条件一:使用基类指针或引用调用虚函数(这里是析构函数)
    	Person* p1 = new Person;
    	Person* p2 = new Student;
    	delete p1;
    	delete p2;
    	return 0;
    }
    
    public:
    	 ~Person() { cout 
    public:
    	 ~Student() { cout 
    	Person* p1 = new Person;
    	Person* p2 = new Student;
    	delete p1;
    	delete p2;
    	return 0;
    }
    
    public:
    	~Person() { cout 
    public:
    	int* ptr = new int[10];//动态开辟空间
    	~Student() { 
    		delete[] ptr;//释放空间
    		cout 
    	Person* p1 = new Person;
    	Person* p2 = new Student;
    	delete p1;
    	delete p2;
    	return 0;
    }
    
    public:
    	 virtual void BuyTicket() final { cout 
    public:
    	virtual void BuyTicket() { cout 
    public:
    	 virtual void BuyTicket(){ cout 
    public:
    	virtual void BuyTicket() override{ cout 
    public:
    	virtual void BuyTicket() = 0;
    };
    class Student : public Person {
    public:
    	virtual void BuyTicket() { cout 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]