在子类中,如果需要调用父类的接口可以直接用父类::函数名的语法。即使该函数在父类中未提供是在父类的父类中提供的,也是按照此种语法编写代码,就像上述代码一样。onEvent()接口是在CBase类提供,在CChild类中调用时仍然使用CDerived:: onEvent()的写法,而不是CBase:: onEvent()。
问题3) 构造函数和析构函数可以被继承吗
构造函数和析构函数是不能被继承的,因为他们只知道在特定的类层次上所执行的操作,所以该类以下所有层次的构造函数和析构函数都应该被调用。
operator=也不能被继承。它完成类似构造函数的操作。继承后,他的含义未必是有右边的对象初始化左边的对象。
问题4) 类的静态成员函数可以被继承吗?
类的静态成员函数与非静态成员函数的共同点(注1):
1) 他们均可被集成到派生类中
2) 如果我们重新定义一个静态成员函数,所有在基类中的其他重载函数均会被隐藏。
静态成员函数不可以是虚函数。
问题5) 使用private继承的目的是什么(注2)?
似乎,使用组合的方式用一个private对象进行组合也可以达到private继承的目的。但是,当我们希望某一个类的行为看起来不像基类时(我们在类的内部却希望使用基类的接口),使用private继承是很好的选择。
问题6) 如何对私有继承成员公有化(注3)?
只要使用public关键字声明这些接口即可。
privatederived.cpp
- ----------------------------------------------------------------------------
- class base {
- public:
- int func1();
- int func2();
- };
- class CDerived : privateCBase {
- public:
- using CBase::func1;
- using CBase::func2;
- };
- void myfunction() {
- CDerived derivedObject;
- derivedObject.func1();
- derivedObject.func2();
- }
- ----------------------------------------------------------------------------
复制代码
问题7) 哪些运算符可以自动继承到派生类?哪些不行?
除了赋值运算符之外,其余运算符均可以集成到派生类中。(注4)
问题8) 派生类的拷贝构造函数中是否需要调用基类的拷贝构造函数?
派生类的拷贝构造函数必须调用基类的拷贝构造函数,否则就会因为编译器强制调用基类的默认构造函数而出现意想不到的结果。
copyconstruction.cpp
- ----------------------------------------------------------------------------
- class CMyObject;
- class CBase{
- public:
- CBase(const CBase& right);
- };
- class CDerived : publicCBase {
- public:
- CDerived(constDerived& right): CBase(right), m_obj(right.m_obj){
- ……
- }
- private:
- CMyObject m_obj;
- }
- ----------------------------------------------------------------------------
复制代码
在上述代码中可以看出,CDerived派生类的拷贝构造函数中,必须先调用基类的拷贝构造函数。这里还遵循了另外一个原则:构造函数中所有成员变量的构造函数都必须在初始化表达式中完成调用(不管是显示的还是隐式的)。
结语:
----------------------------------------------------------------------------
本文中讨论了关于继承的几个小问题,澄清了一些疑问,这些问题对于我们日常编程中有些是常用的知识,而有些比较偏僻,算是对我们的C++知识的一些补充。
参考资料
----------------------------------------------------------------------------
注1:《C++编程思想》两卷合订本中文版(P349),(美) Bruce Eckel Chuck Allison著
注2:《C++编程思想》两卷合订本中文版(P352),(美) Bruce Eckel Chuck Allison著
注3:《C++编程思想》两卷合订本中文版(P352),(美) Bruce Eckel Chuck Allison著
注4:《C++编程思想》两卷合订本中文版(P353),(美) Bruce Eckel Chuck Allison著