请让我分清c++的重载,重写,重定义

c++的重载,重写,重定义这三个概念特别相似
而且名字又差不多 所以直到刚刚我才彻底分清这三个的异同

重载 overload

函数名相同,参数列表不同,重载只是在类的内部存在,不能靠返回值类型来判断

class Base {
	virtual void display() {
		cout << "基类的display()" << endl;
	}
	void say() {
		cout << "基类的say()" << endl; 
	}
public:
	void exec() { display(); say(); }
	void f1(string a) { cout << "基类的 f1(string)" << endl; }
	void f1(int a) { cout << "基类的 f1(int)" << endl; } //overload,两个f1函数在Base类的内部被  重载
};

我们可以看到其中的两个f1方法 因为重名 并且传入参数不同 所以就是重载

重写 override

也叫做覆盖 子类重定义父类中相同名称和参数的虚函数 函数特征相同,具体实现不同,主要是继承关系中出现

注意:
被重写的函数不能是static类型的,必须是虚函数 virtual
重写函数必须具有相同的类型,名称,参数列表
重写函数的访问修饰可以不同,虽然virtual是private类型 但是派生类中改写成pubic和protected也是可以的

重定义

子类重新定义父类中相同名称的非虚函数(参数列表可以不同)

下面我贴出一段代码 给大家做理解的辅助

class Base {
	virtual void display() {
		cout << "基类的display()" << endl;
	}
	void say() {
		cout << "基类的say()" << endl; 
	}
public:
	void exec() { display(); say(); }
	void f1(string a) { cout << "基类的 f1(string)" << endl; }
	void f1(int a) { cout << "基类的 f1(int)" << endl; } //overload,两个f1函数在Base类的内部被  重载
};

class child1 : public Base {
public :
	void display() {
		cout << "子类的display()" << endl;//重写
	}
	void f1(int a, int b) {
		cout << "子类的f1(int a,int b)" << endl;//重定义(f1不是虚函数)
	}
	void say(string s) {
		cout << "子类的say(string a)" << endl;//同上
	}
};

int main() {
	child1 c1;
	Base* b = &c1;
	b->exec();
	cout << "-------------------------" << endl;
	c1.exec();
	cout << "-------------------------" << endl;
	c1.say("a");
}

请让我分清c++的重载,重写,重定义_第1张图片

综上所述

成员函数重载

必须在同一个类中
函数名字相同 参数不同 virtual可有可无

重写(派生类覆盖基类函数)

在不同的类中,
必须带有virtual 函数名字相同,参数相同

重定义

如果派生类的函数与基类的同名,参数不同,则不管有无virtual 基类的函数被隐藏
如果派生类的函数与基类同名 参数相同,但是基类的函数没有virtual 基类函数被隐藏

希望我上边所写对大家有帮助

你可能感兴趣的:(c++,类)