当子类继承基类时,子类包含了父基类所有数据及操作的定义。
在 C++ 实践中,继承主要用于两种场合:
- 实现继承:子类继承父类的实现代码;
- 接口继承,子类仅继承父类的方法名称。
优点:
- 实现继承通过原封不动地重用基类代码减少了代码量。
- 由于继承时编译时声明的,编码者和编译器都可以理解相应地操作并发现错误。
- 接口继承可用于程序上增强类地特定 API 的功能,在类没有定义 API 的必要实现时,编译器同样可以侦破。
缺点:
- 对于实现继承,由于实现子类的代码在父类和子类间延展,要理解其实现变得更加困难。
- 子类不能重写父类的非虚函数,当然也就不能修改其实现。
- 基类可能定义了一些数据成员,还要区分基类的物理轮廓。
结论:
- 不要过多使用实现继承,组合通常更合适一些。
- 所有继承最好必须时
public
的,如果想私有继承的话,应该采取包含基类实例作为成员的方式作为替代。 - 如果该类具有虚函数,其析构函数应该为虚函数。
- 限定仅在子类访问的成员函数为
protected
,需要注意的是,数据成员应始终为私有。 - 当重定义派生的虚函数时,在派生类中明确声明其为
virtual
。遗漏virtual
并不影响其为虚函数的本质,但阅读者需要检索类的所有祖先以确定该函数是否为虚函数。
网友评论