继承中虚函数的缺省参数值问题

本文探讨了C++中继承和虚函数涉及到的缺省参数问题。由于虚函数的动态绑定和缺省参数的静态绑定,导致在重定义虚函数时,缺省参数不会继承自基类。这种设计是为了保持运行效率。文章指出,以对象调用虚函数时必须指定参数值,否则编译器会报错。为了解决这个问题,建议使用非虚拟接口(NVI)模式,通过非虚拟公共函数指定缺省参数,调用私有的可重定义虚拟函数,从而避免重复代码并确保正确的行为。
摘要由CSDN通过智能技术生成

如果类继承中重新定义了虚函数,那么虚函数中的缺省参数不要重新定义。

用一句话来解释原因就是:虚函数是动态绑定的(dynamically bound),但是缺省参数却是静态绑定的(statically bound)。

静态类型和动态类型

首先需要了解什么是对象的静态类型和动态类型,对象的所谓静态类型(static type),就是它在程序中被声明时所采用的类型。

以下面的类为例:

class Shape
{
	public:
	enum ShapeColor{Red,Green,Blue};

	virtual void draw(ShapeColor color=Red) const =0;
};

class Rectangle :public Shape
{
	public:
			virtual void draw(ShapeColor color=Green) const;
};

class Circle:public Shape
{
	public:
			//当以对象调用这个函数时,一定要指定参数值。
			//因为静态绑定下这个函数并不从其base继承缺省的参数值
			//但若以指针或引用调用此函数,可以不指定参数值,
			//因为动态绑定下这个函数会从其base继承缺省参数值
			virtual void draw(ShapeColor) const;
};
考虑下面这些指针:
	Shape *ps;//静态类型是Shape*
	Shape *pc=new Circle;//静态类型是Shape*
	Shape *pr=new Rectangle;//静态类型是Shape*
ps,pc,pr都被声明为point to Shape类型,所以他们都以它为静态类型。

对象的所谓动态类型(dynamic type)则是指它“目前所指向对象的类型”。也就是说,动态类型可以表现出一个对象将会有什么行为。以上例,pc的动态类型是Circle *,pr的动态类型是Rectangle *。ps没有动态类型,因为它尚未指向任何对象。

动态类型和它的名字所示,可以在程序执行过程中改变(通过赋值操作符)

pc=pr;//这条语句把pc的动态类型由Circle*改成了Rectangle*

个人感觉C++中的静态类型和动态类型和C中指针的类型(静态类型)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值