公司网站建设的步骤,常州企业网站,支付网站开发费可以做无形资产,如何免费建立可以交流的网站1.重载与覆盖
重载#xff1a;成员函数被重载的特征#xff1a;在同一个类中#xff0c;函数名相同#xff0c;参数不同#xff0c;vritual关键字可有可无。 覆盖#xff1a;覆盖是指派生类函数覆盖基类函数#xff0c;特征是#xff1a;在有继承关系的类中#xff0…1.重载与覆盖
重载成员函数被重载的特征在同一个类中函数名相同参数不同vritual关键字可有可无。 覆盖覆盖是指派生类函数覆盖基类函数特征是在有继承关系的类中函数名相同参数相同基类必须有vritual关键字。
2.隐藏
前面的介绍你或许很清楚但是要是再加上隐藏就很迷惑了 这里“隐藏”是指派生类的函数屏蔽了与其同名的基类函数规则如下 1如果派生类的函数与基类的函数同名但是参数不同。此时不论有无 virtual 关键字基类的函数将被隐藏注意别与重载混淆。 2如果派生类的函数与基类的函数同名并且参数也相同但是基类函数没有 virtual关键字。此时基类的函数被隐藏注意别与覆盖混淆 1函数 Derived::f(float)覆盖了 Base::f(float)。 2函数 Derived::g(int)隐藏了 Base::g(float)而不是重载。 3函数 Derived::h(float)隐藏了 Base::h(float)而不是覆盖。
#include iostream.h class Base
{
public: virtual void f(float x){ cout Base::f(float) x endl; }
void g(float x){ cout Base::g(float) x endl; } void h(float x){ cout Base::h(float) x endl; }
}; class Derived : public Base
{
public: virtual void f(float x){ cout Derived::f(float) x endl; }
void g(int x){ cout Derived::g(int) x endl; } void h(float x){ cout Derived::h(float) x endl; }
}; 一个小示例
void main(void)
{
Derived d;
Base *pb d;
Derived *pd d;
// Good : behavior depends solely on type of the object
pb-f(3.14f); // Derived::f(float) 3.14
pd-f(3.14f); // Derived::f(float) 3.14
// Bad : behavior depends on type of the pointer
pb-g(3.14f); // Base::g(float) 3.14
pd-g(3.14f); // Derived::g(int) 3 (surprise!)
// Bad : behavior depends on type of the pointer
pb-h(3.14f); // Base::h(float) 3.14 (surprise!)
pd-h(3.14f); // Derived::h(float) 3.14
} 3.摆脱隐藏
隐藏规则引起了不少麻烦。下面示例 程序中语句 pd-f(10)的本意是想调用函数Base::f(int)但是 Base::f(int)不幸被 Derived::f(char *)隐藏了。由于数字 10 不能被隐式地转化为字符串所以在编译时出错。
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
}从示例看来隐藏规则似乎很愚蠢。但是隐藏规则至少有两个存在的理由
写语句 pd-f(10)的人可能真的想调用 Derived::f(char *)函数只是他误将参数写错了。有了隐藏规则编译器就可以明确指出错误这未必不是好事。否则编译器会静悄悄地将错就错程序员将很难发现这个错误流下祸根。假如类 Derived 有多个基类多重继承有时搞不清楚哪些基类定义了函数 f。如果没有隐藏规则那么 pd-f(10)可能会调用一个出乎意料的基类函数 f。尽管隐藏规则看起来不怎么有道理但它的确能消灭这些意外。 如果语句 pd-f(10)一定要调用函数 Base::f(int)那么将类 Derived 修改为如下即可。
class Derived : public Base
{
public:
void f(char *str);
void f(int x) { Base::f(x); }
};