C++中的“三重”

博文内容:重载、重定义(隐藏),重写(覆盖)


三重区别及联系

  • 概念
  • 联系及区别
    • 1、作用域
    • 2、函数要求


概念

重载

函数名相同,函数的参数列表不同(包括参数个数和参数类型),至于返回类型可同可不同。
首先就是对于重载的解释,函数名相同但是参数不同。

class Base
{
public:
	Base()
	{
		cout << "Base()" << endl;
	}

	void Func()
	{
		cout << "Func()" << endl;
	}
	void Func(int)
	{
		cout << "Func(int)" << endl;

	}
	//err
	//int Func(int)
	//{

	//}
	//~Base()
	//{
	//	cout << "~Base()" << endl;
	//}

private:

};

C++中的“三重”_第1张图片

重定义

重定义 (redefining)也叫做隐藏: 子类重新定义父类中有相同名称的非虚函数 ( 参数列表可以不同 ) 。

一般是出现在继承中,对于派生类中函数名与基类中的函数名相同的成员函数。构成重定义。相较于函数重载来说,需要对于参数之类要求只是需要对于函数名相同即可。

class Base
{
public:
	Base()
	{
		cout << "Base()" << endl;
	}

	virtual void Func()
	{
		cout << "Base::Func()" << endl;
	}
	void Func(int)
	{
		cout << "Func(int)" << endl;

	}
	

private:

};

class child:public Base
{
public:
	virtual void Func()
	{
		cout << "child::Func()" << endl;
	}
private:
	int _c;
};

重写

子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改。

和重定义的区别就是关键字virtual ,基类中存在函数前面使用virtual 就是虚函数。与重定义一样都必须是在基类和子类中才会出现这样的定义。但是与重定义的区别在于函数名,参数,返回值都必须相等。也有特例出现例如:
就是对于析构函数,析构函数在底层被取名为destructor,统一命名就会出现对于虚函数实现。
协变(基类与派生类虚函数返回值类型不同)

派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指
针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变

联系及区别

1、作用域

1、重载要求在同一个作用域。
2、 重写(覆盖)、重定义(隐藏)在基类和派生类2个作用域。

2、函数要求

1、重载函数的函数数名相同但是参数不同。
2、重写函数函数名、参数、返回值(协变例外),且都需要有关键字virtual。
3、重定义函数在重写函数的规则上,少了关键字virtual。

你可能感兴趣的:(C++,c++,java,开发语言)