本文是学习重载、重写、重定义的学习笔记。
重载(overload):类中同名函数,通过参数不同,实现不同的功,返回值不同不能作为重载区别。
重写(override):子类重写父类的虚函数,父类函数必须是virtual说明的,不能是static的,是C++实现多态的方式,让父类能调用子类的方法。
重定义(redefining):子类重定义父类的同名非虚函数,参数可以同父类不同。一旦重定义,父类的同名函数将失效。
实验代码:
#include <iostream>
using namespace std;
class A
{
public:
virtual string fun() = 0; //纯虚函数,A是抽象类,不能实例化
};
class B : public A
{
public:
virtual string fun() {return "Class B fun!";} //虚函数,同时是对父类的fun的重写(override)
virtual string fun(string ch) {return "Class B " + ch;} //虚函数,有自己的定义,同时是对本类fun()的重载(overload)
};
class C : public B
{
public:
string fun(){return "Class C fun!";} //对父类的fun的重写(override)
int fun(int i) {return i;} //对本类fun()的重载(overload)
};
class D : public C
{
public:
int fun(int i) {return i*2;} //对父类fun(int)的重定义(redefining)
};
int main(int argc, char *argv[])
{
string str = "Test String";
A* a = new D();
cout<<"a->fun(): "<<a->fun()<<"\n";
B b;
cout<<"b.fun(): "<<b.fun()<<"\n";
cout<<"b.fun(Test String):"<<b.fun(str)<<"\n";
C c;
cout<<"c.fun(): "<<c.fun()<<"\n";
cout<<"c.fun(5): "<<c.fun(5)<<"\n";
D d;
cout<<"d.fun(5): "<<d.fun(5)<<"\n";
return 0;
}