【Effection C++】读书笔记 条款32~条款33
2017-05-19 09:44
399 查看
【Effection C++】继承与面向对象设计
条款32:确定你的public继承塑模出is-a关系
“public 继承”意味着”is a”。适用于base classes身上的每一件事情一定也适用于derived class身上,因为每一个derived class对象也都是一个base class对象。条款33:避免遮掩继承而来的名称
在C++中,内层作用域的名字会遮掩掉外层作用域的名字。对于派生类的作用域就像是被嵌在了基类作用域内部之中。对于C++基类中已有的名字,无论其类型是什么(虚函数,非虚函数,变量等等),如果派生类中重新定义了与基类中的相同的名字,那么就会遮掩从基类中继承而来的名称。 尤其要注意,对于虚函数同样如此。但是注意以指针来调用虚函数的时候,其和以对象来调用虚函数由有着不同的表现。
见如下例子:
class Base { public: void CommonFunction(){cout << "Base::CommonFunction()" << endl;} //重载虚函数 void virtual VirtualFunction(){cout << "Base::VirturalFunction()" << endl;} void virtual VirtualFunction(int t){cout << "Base::VirturalFunction() With int" << endl;} void virtual PureVirtualFunction() = 0; }; class Derived: public Base { public: void CommonFunction(){cout << "Derived::CommonFunction()" << endl;} void virtual VirtualFunction(){cout << "Derived::VirturalFunction()" << endl;} void virtual PureVirtualFunction(){cout << "Derived::PureVirtualFunction()" << endl;} }; int main() { Derived d; d.CommonFunction(); // Derived::CommonFunction() d.VirtualFunction(); // Derived::VirtualFunction() d.VirtualFunction(2); //错误:基类中接受int参数的VirtualFunction虚函数已经被遮掩了 d.PureVirtualFunction(); // Derived::PureVirtualFunction() Base *pB = &d; pB->VirtualFunction(); // Derived::VirtualFunction() pB->VirtualFunction(2); // Base::VirtualFunction(int) return 0; }
如果想要在派生类中使用基类被隐藏的名称,可以使用using声明来使得基类中的名字在派生域可见。要注意using声明后接的只能是名字,而不是函数声明。
如下,可以在派生类的public块中添加如下代码,就可以使得基类中的被隐藏的名字展现在派生类中。
using Base::VirtualFunction; //其他函数的调用不变,但是d可以调用从基类继承的接收int参数的VirtualFunction。 d.VirtualFunction(2); //Base::VirtualFunction(int)
除此之外,还可以通过显示声明作用域来调用相关函数。如下修改派生类中的成员函数,使其只继承了基类中不使用函数参数的VirturalFunction成员函数,隐藏了接受int参数的VirturalFunction成员。
void virtual VirtualFunction() { Base::VirturalFunction(); //通过作用域显示指明调用基类的函数。 }
相关文章推荐
- 【Effection C++】读书笔记 条款07~条款08
- 【Effection C++】读书笔记 条款27:尽量少做转型动作
- 【Effection C++】读书笔记 条款10~条款12
- 【Effection C++】读书笔记 条款20~条款23
- 【Effection C++】读书笔记 条款40:明智而审慎的使用多重继承
- 【Effection C++】读书笔记 条款29~条款30
- 【Effection C++】读书笔记 条款01~条款04
- 【Effection C++】读书笔记 条款26:尽可能延后变量定义式的出现时间
- 【Effection C++】读书笔记 条款36~条款37
- 【Effection C++】读书笔记 条款38~条款39
- 【Effection C++】读书笔记 条款34~条款35
- 【Effection C++】读书笔记 条款28:避免返回handles指向对象内部成分
- 【Effection C++】读书笔记 条款18~条款19
- 【Effection C++】读书笔记 条款05~条款06
- 【Effection C++】读书笔记 条款41~条款42
- 读书笔记_Effective_C++_条款二十二:将成员变量声明为private
- 读书笔记_Effective_C++_条款二十:宁以pass-by-reference-to-const替换pass-by-value
- 读书笔记_Effective_C++_条款十九:设计class犹如设计type
- 读书笔记_Effective_C++_条款二十四: 若所有参数皆需类型转换,请为此采用non-member函数
- 读书笔记_Effective_C++_条款二十三:宁以non-member、non-friend替换member函数