C++成员函数的重载,继承,覆盖和隐藏 (二)

2014-11-24 02:32:56 · 作者: · 浏览: 4

pb->h(3.14f);
pd->h(3.14f);
}
其中子类Derived中 vitual void f(float x) 是覆盖,而void g(int x) 和void h(float x)都是隐藏。

运行结果:

\

再看一个例子:


[html]
#include
using namespace std;

class Base
{
public:
virtual void f(int a) {
cout << "virtual Base::f(int a)" << endl;
}

void f(double d) {
cout << "Base::f(double d)" << endl;
}
};

class Derived : public Base
{
public:

void f(double d) {
cout << "Derivd::f(double d)" << endl;
}
};

int main()
{
Derived d;
d.f(3);
d.f(2.5);

Derived *pd = new Derived();
pd->f(3);
pd->f(2.5);

Base b;
b.f(5);
b.f(3.5);

Base *pBase = new Derived();
pBase->f(5);
pBase->f(3.5);
}

#include
using namespace std;

class Base
{
public:
virtual void f(int a) {
cout << "virtual Base::f(int a)" << endl;
}

void f(double d) {
cout << "Base::f(double d)" << endl;
}
};

class Derived : public Base
{
public:

void f(double d) {
cout << "Derivd::f(double d)" << endl;
}
};

int main()
{
Derived d;
d.f(3);
d.f(2.5);

Derived *pd = new Derived();
pd->f(3);
pd->f(2.5);

Base b;
b.f(5);
b.f(3.5);

Base *pBase = new Derived();
pBase->f(5);
pBase->f(3.5);
}

其中父类中的void f(double d)隐藏了子类的virtual void f(int a), void f(double d)函数。

所以在主函数中


[html]
Derived d;
d.f(3);
d.f(2.5);

Derived *pd = new Derived();
pd->f(3);
pd->f(2.5);

Derived d;
d.f(3);
d.f(2.5);

Derived *pd = new Derived();
pd->f(3);
pd->f(2.5);只要通过Derived对象或者Derived指针执行f()函数,都只执行void Derived::f(double d)该函数。


[html]
Base *pBase = new Derived();
pBase->f(5);
pBase->f(3.5);

Base *pBase = new Derived();
pBase->f(5);
pBase->f(3.5);在调用pBase->f(5)时,首先要去pBase类中找到对应需要执行的函数,因为Base类中有两个函数virtual void f(int a) 和 void f(double)重载,因为该实参是5,为int类型,所以要调用virtual void f(int a)函数,因为该f(int a)是一个虚函数,所以再去判断pBase所指向的具体对象,具体对象为Derived子类,再去Derived子类的虚函数表中找到void f(int a)函数。因为Derived子类继承了父类Base的虚函数vitural void f(int a),所以输出 virtual Base::f(int a);

在调用pBase->f(3.5)时,首先要去pBase类中找到对应需要执行的函数,因为因为Base类中有两个函数virtual void f(int a) 和 void f(double)重载,因为该实参是3.5,为double类,所以要调用void f(double d)函数,因为该函数是一个普通成员函数,故直接输出。 void Base::f(double d);

\

再举一个例子:


[html]
#include
using namespace std;

class Base
{
public:
virtual void f(int a) {
cout << "virtual Base::f(int a)" << endl;
}

void f(double d) {
cout << "Base::f(double d)" << endl;
}
};

class Derived : public Base
{
public:

void f(int a) {
cout << "virtual Derived::f(int a)" << endl;
}
};

int main()
{
Derived d;
d.f(3);
d.f(2.5);

Derived *pd = new Derived();
pd->f(3);
pd->f(2.5);

Base b;
b.f(5);
b.f(3.5);

Base *pBase = new Derived();
pBase->f(5);
pBase->f(3.5);
}

#include
using namespace std;

class Base
{
public:
virtual void f(int a) {
cout << "virtual Base::f(int a)" << endl;
}

void f(double d) {
cout << "Base::f(double d)" << endl;
}
};

class Derived : public Base
{
public:

void f(int a) {
cout << "virtual Derived::f(int a)" << endl;
}
};

int main()
{
Derived d;
d.f(3);
d.f(2.5);

Derived *pd = new Derived();
pd->f(3);
pd->f(2.5);

Base b;
b.f(5);
b.f(3.5);

Base *pBase = new Derived();
pBase->f(5);
pBase->f(3.5);
}

子类Derived中的void f(int a)既覆盖了基类Base的虚函数virtual void f(int a),也隐藏了基类的virtual void f(int a), void f(double d)函数。


[html]
Derived d;
d.f(3);
d.f(2.5);

Derived *pd = new Derived();
pd->f(3);
pd->f(2.5);

Derived d;
d.f(3);
d.f(2.5);

Derived *pd = new Derived();
pd->f(3);
pd->f(2.5);同理所有用子类对象或者子类指针来调用f()函数时,都只执行virtual void f(int a),输出virtual Derived::f(int a)


[html] view plaincopyprint Base *pBase = new Derived();
pBase->f(5);
pBase->f(3.5);

Base *pBase = new Derived();
pBase->f(5);
pBase->f(3.5);pBase->f(5),首先去Base类中寻找相应的函数,同理Base类中的两个函数virtual void f(int a)和void f(double d)是