overload , override & overwrite

1.overload(重载)

这个没什么歧义的。就是在同一个命名空间(或者作用域)中,函数具有相同的名字,但参数类型(包括const修饰)或参数个数不同,被编译器编译成不同函数。

2.override(覆盖、覆写、重写)

override是指在类继承结构中,子类对父类的virtual方法(函数)进行重新定义。

virtual关键字,告诉编译器这个函数要支持多态。不是根据指针类型判断如何调用,而是要根据指针所指向的实际对象类型来判断如何调用。

父类重载的方法不会被子类方法覆盖,通过父类指针(引用)指向子类的指针仍可直接调用父类重载的方法。

#include <iostream> 
#include <stdio.h>
using namespace std;

class AA{
public:
	virtual void print()
	{
		cout<<"I am AA"<<endl;
	}
	virtual void print(int a)
	{
		cout<<"I am AA:"<< a<<endl;
	}
	void print(int a1,int a2)
	{
		cout<<"I am AA:"<<a1<<","<<a2<<endl;
	}

private:
	int aa;
};

class BB :public AA{
public:
	virtual void print()
	{
		cout<<"I am BB"<<endl;
	}
private:
	int bb;
};

int main(void)
{
	AA a1;
	BB b1;
	
	AA *pa = &b1;
	pa->print(); 
	pa->print(3);
	pa->print(3,5);

}
输出:
I am BB
I am AA:3
I am AA:3,5

3.overwrite(重写、改写、复写)

是指在类继承结构中,子类对父类的l方法(函数)进行重新定义。

父类重载的方法会被子类方法覆盖,子类的对象或子类对象的指针(引用)。不能直接调用父类重载的方法(非 virtual方法),需要用到作用域运算符。如果没有overwrite,则可以。

由于是非virtual方法,所以指针、引用、对象 是什么类型的,就按什么类型的用。用父类指针会引用指向子类,调用的是父类的方法(非virtual方法)。

#include <iostream> 
#include <stdio.h>
using namespace std;

class AA{
public:
	void print2()
	{
		cout<<"I am AA"<<endl;
	}
	void print2(int a)
	{
		cout<<"I am AA"<<a<<endl;
	}
private:
	int aa;
};

class BB :public AA{
public:
	void print2()
		{
			cout<<"I am BB"<<endl;
		}
private:
	int bb;
};

int main(void)
{
	AA a1;
	BB b1;
	
	AA *pa = &b1;
	pa->print2();
	pa->print2(5);
	b1.print2();
//	b1.print2(7);
	
}
输出: 
I am AA
I am AA5
I am BB

b1.print2(7)会报错 


#include <iostream> 
#include <stdio.h>
using namespace std;

class AA{
public:
	virtual void print2()
	{
		cout<<"I am AA"<<endl;
	}
	void print2(int a)
	{
		cout<<"I am AA"<<a<<endl;
	}
private:
	int aa;
};

class BB :public AA{
public:
	void print2()
		{
			cout<<"I am BB"<<endl;
		}
private:
	int bb;
};

int main(void)
{
	AA a1;
	BB b1;
	
	AA *pa = &b1;
	pa->print2();
	pa->print2(5);
	b1.print2();
//	b1.print2(7);
	
}<pre name="code" class="cpp">输出: 
I am BB
I am AA5
I am BB

b1.print2(7)会报错 
 
 

猜你喜欢

转载自blog.csdn.net/u013411873/article/details/48594285