C++同名函数访问规则

来源:互联网 发布:淘宝申请退款时间5天 编辑:程序博客网 时间:2024/06/06 02:05


#include <iostream>class Base{public:virtual int start(){std::cout<<"Base start"<<std::endl;}int middle(){std::cout<<"Base middle"<<std::endl;}virtual int end(){std::cout<<"Base end"<<std::endl;}};class Derived : public Base{public:virtualint start();int middle(){std::cout<<"***Derived middle"<<std::endl;Base::middle();} virtualint end(int m){std::cout<<"Derived end"<<std::endl;}private:int m_b;};int Derived::start(){std::cout<<"Derived start"<<std::endl;}int main(){Derived *pDerived = new Derived();Base *pBase = new Derived();pBase->start();pBase->middle();pBase->end();pDerived->middle();}




一、派生类与基类函数同名

1.派生类的虚函数和基类的虚函数原型相同(即参数一致),使用基类指针指向派生类,调用该虚函数,将会调的是派生类的虚函数,如start函数。(多态,动态联编的精髓,注意,虚函数的函数名和参数类型一定要相同)

2.派生类的虚函数和基类的虚函数原型不相同(即参数不一致),使用基类指针指向派生类,调用该虚函数,将会调的是基类的虚函数,如函数end。(所以原型一致很重要)

3.非虚函数的情况下,派生类的普通函数和基类的普通函数原型相同(即参数一致),使用基类指针指向派生类,调用该普通函数,结果调用的是基类的普通函数。(这也说明了想用基类来指向派生类实现函数多态,必须是定义原型一致的虚函数,而不是普通函数)

4.覆盖,派生类的普通函数和基类的普通函数原型相同(即参数一致),使用派生类指针指向派生类,调用该普通函数,结果调用的是派生类的普通函数,如middle。(属于同名覆盖,覆盖基类同名函数)

5.关于第4条,被覆盖的情况下,可以加上基类类名显式调用基类函数,如派生类中的middle函数,里面指定了Base::middle


二、关于重载

1.同一个类中,如果不能重载虚函数,

如定义了

virtual   int  set();

不能在这个类里再定义 int set(int m);之类的



2.与类无关的重载,那必然是根据类的参数和类型来选择调用。






原创粉丝点击