c++中的重载,重写,重定义

c++中的几个容易混淆的概念:

(1)重载:在同一作用域中,函数名相同,参数列表不同,返回值可同可不同的函数。

关于函数重载的知识在《函数重载》这篇博客中有详细介绍。

(2)重写:又叫覆盖,是指不在同一个作用域中(分别在父类和子类中),函数名,

数个数,参数类型,返回值类型都相同,并且父类函数必须有virtual关键字的函数,

就构成了重写(协变除外)。

协变:协变也是一种重写,只是父类和子类中的函数的返回值不同,父类的函数返回父

类的指针或者引用,子类函数返回子类的指针或者引用。

下边看个例子:

class B
{
public:
	B()
		:_num(1)
	{}
	virtual void Show()
	{
		cout << _num << endl;
	}
protected:
	int _num;
};
class D :public B
{
public:
	D()
		:_num(2)
	{}
	virtual void Show()
	{
		cout << _num << endl;
	}
protected:
	int _num;
};

int main()
{
	D d;
	d.Show();
	cout << sizeof(d) << endl;
	system("pause");
	return 0;
}


这段程序中,Show函数和_num成员都被重写了,调用d的Show函数打印2.sizeof(d)

的结果是12.没错,就是12.父类的Show函数被子类的Show函数覆盖,_num只是被隐藏

了(下边介绍),但是仍然存在,另外内存中还会存在一个虚函数表的指针,存放虚函

数的地址,通过查看虚函数表可以发现,表中只会存放子类Show函数的地址,说明父类

的Show函数被覆盖。如下图:


(3)重定义:又叫隐藏,是指在不同的作用域中(分别在父类和子类中),函数名相

同,不能构成重写的都是重定义(重定义的不光是函数,还可以是成员变量)。上例中

的_num成员就构成了重定义(子类中仍然存在),这里就不再给出实例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值