// derive.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class base
{
public:
virtual void xfn(int i)
{
cout<<"base::xfn(int i)"<<endl;
}
virtual void yfn(float f)
{
cout <<"base::yfn(float f)"<<endl;
}
void zfn()
{
cout <<"base::zfn()"<<endl;
}
virtual void afn()
{
cout <<"base::afn()"<<endl;
}
protected:
private:
};
class derived:public base
{
public:
virtual void xfn(int i)
{
cout<<"derived::xfn(int i)"<<endl;
}
void yfn(int c)
{
cout <<"derived::yfn(int c)"<<endl;
}
void zfn()
{
cout <<"derived::zfn()"<<endl;
}
void fn()
{
cout << "derived::fn()"<<endl;
}
protected:
private:
};
int _tmain(int argc, _TCHAR* argv[])
{
derived d;
base *pb = &d;
derived *pd = &d;
/*基类与子类函数名、参数一样,且都为虚函数则形成覆盖,虚函数的覆盖产生多态。
基类与子类函数名一样,参数与虚函数只要不符合上面规则就属于隐藏。
*/
//一般来说,基类指针调用基类函数,之类指针调用子类函数,但多态情况除外:
pb->xfn(5); //derived::xfn(int i),虚函数覆盖形成多态,调用子类函数。
pd->xfn(5); //derived::xfn(int i)
pb->yfn(3.14f); //base::yfn(float f)
pd->yfn(3.14f); //derived::yfn(int c),虽然基类有Virtual,但与子类参数表不一样,所以这里
//子类函数对基类函数形成隐藏。即便基类函数为float,也不能使用,因为子类看不到。
pb->zfn(); //base::zfn()
pd->zfn(); //derived::zfn(),函数、参数一样,但基类没有Virtual,还是会隐藏基类同名函数。
pb->afn(); //base::afn()
pd->afn(); //base::afn(),子类函数即没有覆盖也没隐藏,完全继承之基类。
//pb->fn(); //error:“fn”: 不是“base”的成员。
pd->fn(); //derived::fn()
cout<<endl<<endl;
base e;
base *pb1 = &e;
//derived *pd1 = &e;//error:不能用子类指针指向基类对象。
pb1->xfn(5); //base::xfn(int i)
pb1->yfn(3.14f); //base::yfn(float f)
pb1->zfn(); //base::zfn()
return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lz_26/archive/2009/07/16/4353450.aspx