继承与遮掩问题
继承与遮掩问题
继承:
pure virtual 函数的目的是为了让Derived class 只继承函数接口。
impure virtual(虚) 函数的目的是让Derived class 继承该函数的接口和缺省实现。
non-virtual(普通) 函数的目的是为了令Derived class 继承函数的接口及一份强制性实现。如果成员函数是个non-virtual函数,意味着它并不打算在Derived class中有不同的行为。
遮掩:
以作用域为基础的“名称遮掩规则”同样适用于类的继承。而且不论函数是virtual或non-virtual都一体适用。
事例:
Derived class 内的名称会遮掩 Base class 内的名称。
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();
};
Derived d;
int x;
d.mf1(); //没问题,调用Derived::mf1;
d.mf1(x); //错误,因为Derived::mf1遮掩了Base::mf1
d.mf2(); //没问题,调用Base::mf2
d.mf3(); //没问题,调用Derived::mf3
d.mf3(x) //错误,因为Derived::mf3遮掩了Base::mf3
为了让遮掩的名称再见天日,可使用using 声明式或转交函数。
事例:
使用using声明式解决遮掩问题。
class Derived: public Base
{
public:
using Base::mf1; //让Base class 内名为mf1和mf3的所有东西
using Base::mf3; //在Derived 作用域内都可见。
virtual void mf1();
void mf3();
void mf4();
};
Derived d;
int x;
d.mf1(); //没问题,调用Derived::mf1;
d.mf1(x); //现在没问题了,调用Base::mf1
d.mf2(); //没问题,调用Base::mf2
d.mf3(); //没问题,调用Derived::mf3
d.mf3(x) //现在没问题了,调用Base::mf3
使用 using 声明还可以做到在Derived类中重载Base类中的函数(别忘了,原来意义的重载只可以重载当前类中的函数)。
补充:软件开发 , C++ ,