参考博客(转)
http://blog.chinaunix.net/uid-26611383-id-3758647.html
http://blog.csdn.net/hackbuteer1/article/details/7475622
什么是重载?
重载是对于一个类而言的。
在一个类中,两个成员函数的函数名相同,参数类型、个数不同,不论是否有virtual关键字。
那么什么是覆盖?
覆盖是相对两个类(父子类)而言的。
在父类与子类中,成员函数的函数名相同,参数相同,且父类中的函数有virtual关键字修饰。(多态性的基础)
那么什么是隐藏呢?
隐藏也是相对两个类(父子类)而言的。
1、在父类与子类中,成员函数的函数名相同,参数不同,不论父类中的成员函数是否有virtual关键字修饰。
2、在父类与子类中,成员函数的函数名相同,参数相同,且父类中的成员函数没有virtual关键字修饰。
什么是多态性?
多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。多态(polymorphism),字面意思多种形状。
最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数,可以根据指向的子类的不同而实现不同的方法。
a、编译时多态性:通过重载函数实现
b、运行时多态性:通过虚函数实现。
<span style="font-size:18px;background-color: rgb(255, 255, 153);">//父类</span>
<span style="font-size:18px;background-color: rgb(255, 255, 255);">class CBase
{
public:
CBase(){}
~CBase(){}
virtual void fun1(){}
int fun1(int){} //此处的fun1与上行的fun1为重载关系
virtual void fun2(){}
void fun3(){}
void fun4(){}
protect:
private:
};
</span>
<span style="font-size:18px;"><span style="background-color: rgb(153, 255, 255);">//子类</span><span style="background-color: rgb(255, 255, 255);">
class CDerived : public CBase
{
public:</span></span>
<span style="font-size:18px;"><span style="background-color: rgb(255, 255, 255);"> using CBase::fun4; //使得子类能够使用基类被隐藏的函数
CDerived(){}
~CDerived(){}
void fun2(){} //此处的fun2与基类CBase中的fun2为覆盖关系
virtual void fun3(int){} //此处的fun3与基类CBase中的fun3为隐藏关系
void fun4(){} //此处的fun4与基类CBase中的fun4为隐藏关系
protect:
private:
};</span></span>
<span style="font-size:18px;"><span style="background-color: rgb(255, 255, 255);">
</span></span>
<span style="font-size:18px;"><span style="background-color: rgb(255, 255, 255);">CDerived d;</span></span>
<span style="font-size:18px;"><span style="background-color: rgb(255, 255, 255);">d.fun3(); //这里会报错。因为子类函数fun3将基类的函数隐藏了</span></span>
<span style="font-size:18px;"><span style="background-color: rgb(255, 255, 255);">d.fun4(); //此处成功。</span></span>