Posted on 2007-08-13 10:16
宝杉 阅读(125)
评论(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。
指针类型
对象类型
面向对象动态的设计,应该是对象类型起到关键作用,而不是指针类型。