标签:
int x;//global变量 void somefunc(){ double x;//local变量,这个变量会遮掩吊全局变量,在这个函数体内,改变的是double的x。 cin>>x; }
class base{ private: int x; public: virtual void mf1()=0; virtual void mf1(int ); virtual void mf2(); void mf3(); void mf3(double); ... }; class derived :public base{ public: virtual void mf1(); void mf3(); void mf4(); }; int main(){ derived d; int x; d.mf1();//true 调用derived::mf1 d.mf1(x);//wrong derived::mf1遮掩了base::mf1(int) d.mf2();//true d.mf3();//true d.mf3(x);//wrong derived::mf3遮掩了base::mf3(double) } //这里面的是名称遮掩规则,不考虑参数的类型,而是直接考虑名称,这里直接相关的东西是作用域这个东西。 //解决办法:在main函数中,明确的使用using声明表达式去显示的调用自己享用的函数即可。
class b{ public: void mf(); }; class d:public b{ void mf(); }; int main(){ d x; b* pb=&x; pb->mf(); d* pd=&x; pd->mf(); } //其中b的mf函数和d的函数mf都是静态绑定的,non-virtual函数。但是如果mf是一个virtual函数的话,那么virtual是动态绑定的,mf是个virtual函数,不论通过pb还是pd //调用mf,都会是调用的pd::mf()。
class shape{ public: enum shapecolor{red,green,blue}; virtual void draw(shapecolor color = red)const=0;//带有默认参数的virtual函数绝对不重新定义该默认参数 ... }; class rectangle:public shape{ public: virtual void draw(shapecolor color = red)const;//这样就代码重复了 }; //修改的版本 class shape{ public: enum shapecolor{red,green,blue}; void draw(shapecolor color = red)const{ dodraw(color); } ... private: virtual void dodraw(shapecolor color)cosnt = 0; }; class rectangle:public shape{ public: ... ; private: virtual void dodraw(shapecolor color)const;//这里不需要指定默认参数值 }; //这里就是利用了non-virtual函数永远不会被派生类重写,这样就能保证默认参数值不会被修改和重新定义了。
标签:
原文地址:http://www.cnblogs.com/Kobe10/p/5743701.html