条款32 确定你的public继承是is-a的关系
条款33 避免遮掩继承而来的名称
确定你的public继承是is-a的关系
在所有public继承的背后,一定要保证父类的所有特性子类都可以满足(例如:父类能飞,子类一定可以飞)。抽象起来说,就是在可以使用父类的地方,都一定可以使用子类去替换。
避免遮掩继承而来的名称
看一个示例:
class Base
{
public:
virtual void func() = 0;
virtual void func(int)
{ cout << "Base::func(int)"<<endl;}
};
class Derived : public Base
{
public:
virtual void func()
{cout << "Derived::func()"<<endl;}
};
int main(int argc, char *argv[])
{
Derived d;
int val = 1;
d.func();
d.func(val);//这句话肯定会报错 因为子类的func覆盖了基类的函数
return 0;
}
derived class内的名称会掩盖base class内的名称。
使用using声明式,可以让Base class内名为func的所有东西在Derived作用域内都可见。
如下:
class Derived : public Base
{
public:
using Base::func;
virtual void func()
{cout << "Derived::func()"<<endl;}
};
...
//打印结果
Derived::func()
Base::func(int)
这样就能正常运行了。