函数的多态原理

本文深入探讨面向对象编程的三大核心概念:封装、继承和多态,通过具体代码示例展示多态如何在C++中实现,以及virtual关键字的作用。文章通过对比virtual关键字有无情况下的代码行为差异,阐述了多态在面向对象编程中的重要性和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、面向对象的三大概念、三种境界(封装,继承,多态)

         封装:突破了C语言的概念,有用了类,成员函数与属性

         继承:  继承可以复用以前人写的代码

         多态:多态,不仅继承以前的人代码,后来人的代码

 

2、加了virtual的时候回发生多态


#include <iostream>
using namespace std;

class Parent
{
public:
	Parent(int a)
	{
		this->a = a;
		cout<<"Parent a"<<a<<endl;
	}

	virtual void print() //子类的和父类的函数名字一样
	{
		cout<<"Parent 打印 a:"<<a<<endl;
	}
protected:
private:
	int a ;
};

class Child : public Parent
{
public:
	Child(int b) : Parent(10)
	{
		this->b = b;
		cout<<"Child b"<<b<<endl;
	}
	virtual void print() //virtual   父类写了virtual,子类可写可不写 
	{
		cout<<"Child 打印  b:"<<b<<endl;
	}
protected:
private:
	int b;
};

void howToPrint(Parent *base)        // 传来子类对象,就执行子类的函数,传来父类的对对象,就执行父类的函数
{
	base->print(); //一种调用语句 有多种表现形态...
}

void howToPrint2(Parent &base)
{
	base.print();
}
void main()
{
	
	Parent	*base = NULL;
	Parent	p1(20);
	Child	c1(30);

	base = &p1;         
	base->print(); //执行父类的打印函数

	base = &c1;      // 根据兼容性原则,可以把子类的对象赋值给父类的指针
	base->print(); //执行谁的函数 ?  //面向对象新需求


	{    // 使用引用的方法 
		Parent &base2 = p1;     // 使用引用的方法
		base2.print();

		Parent &base3 = c1; //base3是c1 的别名
		base3.print();
	}


	//函数调用
	howToPrint(&p1);
	howToPrint(&c1);

	howToPrint2(p1);      // 这两个是使用了引用的方法
	howToPrint2(c1);



	
	cout<<"hello..."<<endl;
	system("pause");
	return ;
}

 运行结果:

 

3、如果上述我们将父类和子类中的virtual关键字去掉,就不会发生多态的情况

 

4、多态的需求

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值