宝杉的博客

UNIX/LINUX;ACE;SNMP;C++
posts - 33, comments - 23, trackbacks - 0, articles - 0

08-08 隐藏

Posted on 2007-08-13 10:16 宝杉 阅读(118) 评论(0)  编辑 收藏 引用 所属分类: C++

隐藏规则:

“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:

1)如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。

2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)。

 

回顾

静态多态性:函数重载;运算符重载;

动态多态性:继承;虚函数;

 

上述例子之所以使用指针目的是:表达一种动态性质,即当指针指向不同对象可以调用不同方法。但事实上不能达到这样的效果。虽然可以强制指针的类型转换((derived *p->g();),或者直接调用指向派生类的指针,但是只要将成员函数声明为virtual就能起到这样的作用。

隐藏

不同指针指向同一地址,那么指针的类型决定调用方法,还是指针指向的对象?

例子:C++exams\hide

可以看出,virtual函数可以实现不同类型的指针指向不同对象,调用不同的方法。

就是说,当父类对象和子类对象同时存在,且调用父子对象的同名方法时,只能用虚拟函数实现。

 

另外,提供一种思路:

如果基类与派生类的同名函数参数不同,比如:

class Base

{

public:

void f(int x);

};

class Derived : public Base

{

public:

void f(char *str);

};

void Test(void)

{

Derived *pd = new Derived;

pd->f(10);  // error

}

基类为int,派生类为string.如果想在派生类中调用基类的方法,即在派生类中添加基类方法的调用。

class Derived : public Base

{

public:

void f(char *str);

void f(int x) { Base::f(x); }

};

但此做法容易混乱,不宜使用。最好的方法还是用virtual

 

指针类型

对象类型

面向对象动态的设计,应该是对象类型起到关键作用,而不是指针类型。


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理