non-virtual和virtual函数(49)

首先,普通函数的派生会出现遮掩情况:

如;基类有多个重载函数(fun)。派生类只要定义一个(fun);
所有的基类函数(fun(int)、fun(double)等)不能使用。
当然可以通过using::Base::fun()来解决。
(编译器智能使用父子关系类的fun函数)

遮掩不仅会阻止派生类内部访问基类,还有种情况:

class B {public: void mf();}
class D : Public B {public: void mf();}

D x;
B* pb = &x;
D* pd = &x;
pb->mf();//调用B的mf函数
pd->mf();//调用D的mf函数
//得出,它只看定义类型调用。那一定是编译期间的覆盖。

另外还有种情况会出现遮掩:

class B {virtual void f() const;}
class A : public B {virtual void f();}
//只是少了个const也会出现遮掩

写个基类调用函数: ps1->Shape::draw();

写一个转交函数:

class GameCharacter {
    public:
        int healthValue() const {
            ....
            int rectval = doHealthValue();
            return retVal;
        }
    private:
        virtual int doHealthValue() const {..}
    //转交虚函数的调用。
} 

讲下虚函数的参数:缺省参数

++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class B {public: virtual void mf(int a = 2);}
class D : Public B {public: virtual void mf(int a = 3);}
B* pb = new B;
D* pd = new D;
pb->mf();//调用B的mf函数
pd->mf();//调用D的mf函数
//但是,缺省参数时静态编译的,当出现下面情况的时候。
pb = pd;
pb->mf()//调用的却是B的mf函数.
解决方案:
取消默认赋值,为派生写转交函数来达到相同的效果。
public:
void draw(int a = 3) const {doDraw(a)}//调用虚函数
private:
virtual void doDraw(int a) const {}//构建虚函数
// //