【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++】读书笔记 条款32~条款33相关推荐

  1. 读书笔记_Effective_C++_条款七:为多态基类声明virtual析构函数

    严格来说,多态分为编译时多态和运行时多态,编译时多态是函数的重载,而运行时多态则是迟绑定技术,即根据基类指针或引用的实际指向来决定采取何种行动,一般来说,多态特指运行时多态.下面我们来举有关C++多态 ...

  2. 读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第二部分)...

    下面再来看书,去理解书上说的Handler classes就简单多了,我们大概过一下. 假设我们要写一个Person类,如下: 1 class Person 2 { 3 private: 4 stri ...

  3. 读书笔记_Effective_C++_条款十九:设计class犹如设计type

    这里初看到"class"和"type",感觉他们是说的是同一样东西,但仔细读了一下,两者在文中还是有区别的.class侧重于自定义的类,而type侧重于系统预定 ...

  4. 读书笔记_Effective_C++_条款二十四: 若所有参数皆需类型转换,请为此采用non-member函数...

    class A { private:int a; public:A(int x) :a(x){}A operator*(const A& x){return A(a*x.a);} };int ...

  5. 《Advanced .NET Debugging》 读书笔记 Listing 3-2: 如何查看程序的PID

    1. 双击03simple.exe 2. 打开commandline prompt,运行tlist,可以查到该进程的pid是3024 转载于:https://www.cnblogs.com/charr ...

  6. 【Effection C++】读书笔记 条款29~条款30

    [Effective C++]读书笔记 Part5 实现 条款29:为异常安全而努力是值得的 当异常被抛出时,待哟异常安全性的函数会: 不泄漏任何资源. 不允许数据败坏. 异常安全函数提供以下三个保证 ...

  7. 【Effection C++】读书笔记 条款28:避免返回handles指向对象内部成分

    [Effective C++]读书笔记 Part5 实现 条款28:避免返回handles指向对象内部成分 避免返回handles(包括references,指针,迭代器)指向对象内部.遵守这个条款可 ...

  8. 【Effection C++】读书笔记 条款27:尽量少做转型动作

    [Effective C++]读书笔记 Part5 实现 条款27:尽量少做转型动作 C++中的类型转换语法 类型转换语法主要有三种不同的形式: (T)expression //将expression ...

  9. 【Effection C++】读书笔记 条款26:尽可能延后变量定义式的出现时间

    [Effective C++]读书笔记 Part5 实现 条款26:尽可能延后变量定义式的出现时间 非循环中的变量定义 尽量延后变量定义式的出现时间,主要包括两个方面: 直到必须使用变量的时候才对其进 ...

最新文章

  1. java文件下载文件名乱码
  2. 程序员,是否应该有自己的职业规划?
  3. java option作用_java – 类Option [T]的意义是什么?
  4. mysql导出停机_MySQL自动停机的问题处理实战记录
  5. Spark _15 _广播变量和累加器
  6. Oracle数据库常用技术
  7. 信息系统开发平台OpenExpressApp - 应用模型ApplicationModel
  8. 习题6-3 使用函数输出指定范围内的完数 (20 分)
  9. bootscripttable前端排序无效_前端你应该知道的八条bug分享给你们
  10. Effective c++读书笔记
  11. QQ超市模拟排配2D版 1.08 (XNA4.0)
  12. Redies(一款高性能的数据库)
  13. ADC驱动器/差分放大器设计指南
  14. python视频转图片
  15. nebula模拟器_Nebula街机模拟器使用方法 Nebula街机模拟器怎么用
  16. 《写作是门手艺》读书笔记
  17. 内网 NTP 服务自动对时,ikuai 软路由 ntp 对时方案
  18. STM32-USB学习系列(一) :USB与USB库的介绍
  19. PHP怎样大幅度降低图片大小但最大程度保持图片清晰?
  20. 大数据团队必须设置的五种职位

热门文章

  1. node:internal/modules/cjs/loader:936
  2. 索尼爱立信C903回顾
  3. 纯CSS实现背景渐变、球和阶梯的跳动
  4. 图片工厂怎么制作场景拼图 图片工厂制作场景拼图教程
  5. 软件工程概论学习进度表第一周
  6. 支持python的开发板_PYNQ-Z1:支持Python编程的Zynq开发板
  7. 弦截法c语言求方程XeX-1=0的解,编程用弦截法求方程 f(x)=3x^3-5x^2+16x-60=0的根
  8. iPhone如何查找序列号
  9. Hi3861板卡介绍
  10. Python爬虫实战之 爬取王者荣耀皮肤