C++那.事,多态、抽象类

本文深入探讨C++中的多态概念,包括虚函数的使用,虚继承的机制,以及抽象类与纯虚函数的定义。通过具体代码示例,解释了如何通过虚函数实现在不同类中的多态行为,以及虚继承如何避免多次调用基类构造函数的问题。

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

多态

多态可以理解为源于用一类的其他类具有相同的特性,但具体的属性、行为、表现又不相同。继承同一基类的子类,都可以实现同一函数,但具体调用时又存在差异。在基类中定义虚函数,让其子类来具体实现这个函数用来做什么。

1、虚函数

#include<iostream>
using namespace std;
class D
{
	public :
		D()
		{
			cout<<"调用D的构造函数。"<<endl;
		}
	public: 
	virtual void display()
	{
		
	}  
};
class C :public D
{
	public :
		C()
		{
			cout<<"调用C的构造函数。"<<endl;
		}
	public: 
	void display()
	{
		cout<<"C"<<endl;	
	}  
};
class B:public D
{
	public :
		B()
		{
			cout<<"调用B的构造函数。"<<endl;
		}
	public: 
	void display()
	{
		cout<<"B"<<endl;
	}  
};
class A :public B,public C
{
	public :
		A()
		{
			cout<<"调用A的构造函数。"<<endl;
		}
	public: 
	void display()
	{
		cout<<"A"<<endl;
	}  
};
int main()
{   
 	A a;
	a.display(); 
	return 0;
}`

运行结果
如果这样调用不会明显产生虚函数的优势,因为如果不是虚函数,在子类中调用和父类重名函数,也是子类优先。

int main()
{   
 	D *d = new A();
	d->display();
	return 0;
}
用子类实例化父类,在调用时会调用子类已经重写了的虚函数。

虚继承

上面代码发现调用了两次D类的构造函数,因为是正常继承,如果换成虚继承,对虚继承基类构造函数的调用只会进行一次,防止这个虚继承的其他派生类对虚继承构造函数的调用。
在继承方式前加 virtual,其他代码相同。
#include<iostream>
using namespace std;
class D
{
	public :
		D()
		{
			cout<<"调用D的构造函数。"<<endl;
		}
	public: 
	virtual void display()
	{
		
	}  
};
class C :virtual public D
{
	public :
		C()
		{
			cout<<"调用C的构造函数。"<<endl;
		}
	public: 
	void display()
	{
		cout<<"C"<<endl;	
	}  
};
class B:virtual public D
{
	public :
		B()
		{
			cout<<"调用B的构造函数。"<<endl;
		}
	public: 
	void display()
	{
		cout<<"B"<<endl;
	}  
};
class A :public B,public C
{
	public :
		A()
		{
			cout<<"调用A的构造函数。"<<endl;
		}
	public: 
	void display()
	{
		cout<<"A"<<endl;
	}  
};
int main()
{   
 	D *d = new A();
	d->display();
	return 0;
}

抽象类

含有纯虚函数的类称为抽象类

纯虚函数

在虚函数后加=0;并且去掉函数体{}。
区别:虚函数的作用是能够让基类的指针访问到继承树中任何类的同名函数,而纯虚函数则真正代表了,这仅仅是定义了一个接口,在定义了这个纯虚函数(接口)的类中,这个纯虚函数一定不可以实现,继承这个抽象类的子类必须要实现这个接口,否则那个子类也是一个抽象类,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值