effective C++ 继承与面向对象设计 笔记

原创 2012年03月21日 21:40:33

继承与面向对象设计

32.确定你的public继承塑模出is-a关系

public继承意味着is-a,适用于baseclasses 身上的每一件事情一定也使用于derived classes身上,因为每一个derived class对象也都是一个baseclass对象

 

33.避免遮掩继承而来的名称

Derived classes内的名称为遮掩base classes 内的名称,在public继承下,从来没有人希望如此,因为public 继承锁暗示的basederived classes之间是is-a关系。

为了让遮掩的名称再见天日,可使用using申明式  using Base::mf1

或者转交函数   virtual void mf1(){ Base::mf1();}

 

34.区分接口继承和实现继承

   pure virtual 函数, simple(impure) virtual 函数,non-virtual函数之间的差异,使得你得以精确指定你想要derived classes继承的东西:只继承接口,或是继承接口和一份缺省实现, 或是继承接口和一份强制实现。由于这些不同类型的声明意味根本意义并不相同的事情,当你声明你的成员函数时,必须谨慎选择。

接口继承和实现继承不同,在Public继承之下,derived classes 总是继承base class的接口

Pure virtual函数只具体指定接口继承

简朴impure virtual函数具体指定接口继承及缺省实现继承

Non-virtual 函数具体指定接口继承以及强制性实现继承

 

35.考虑virtual函数以外的其他选择

NVI手法

 

36.绝不重新定义继承而来的non-virutal函数

在任何情况下,都不应该重新定义一个继承而来的non-virtual函数,否则会违背public继承的is-a的关系和违背non-virtual函数的不变性高于其特异性。

 

37.绝不重新定义继承而来的缺省参数值

你只能继承两种函数,virtual函数和non-virtual函数,而后者是错误的,那么可不可继承一个带有缺省参数的virtual函数呢?

virtual函数系动态绑定而来,调用一个virtual函数时,究竟调用哪一份函数实现代码,取决于发出调用的那个对象的动态类型。

而缺省参数值确实静态绑定(staticallybound

 

 

38.通过复合塑模出has-a或“根据某物实现出”

list不能应用于set, list允许重复,而set不允许重复

复合(composition)的意义和Public继承完全不同

在应用域(applicationdomain),复合意味着has-a(有一个),在实现域(implementation domain),复合意味着is-implemented-in-terms-of(根据某物实现出)

 

39.明智而审慎地使用private继承

如果classes之间的继承关系是private,编译器不会自动将一个derived class对象转换成一个base class对象,这和public 继承不同,由private base class继承而来的所有成员,在derivedclass中都会变成private属性,纵使它们在baseclass中原本是protected public属性

 

compositionprivate之间,尽可能使用复合,必要时才使用private继承。

private继承意味着只有实现部分被继承,接口部分应略去。如果Dprivate形式继承B,意思是D对象根据B对象实现而得,再没有其他意义了。

 

Private继承意味着is-implemented-in-terms of (根据某物实现出),它通常比复合(composition)的级别低,但是当derived class需要访问protectedbase class的成员,或需要重新定义继承而来的virtual函数时,这么设计是合理的

和复合(composition)不同,private继承可以造成empty base最优化,这对致力于“对象尺寸最小化”的程序库开发者而言,可能很重要

 

40.明智而审慎地使用多重继承

如果你有一个单一继承的设计方案,而它大约等价于一个多重继承设计方案,那么单一继承设计方案一定比较受欢迎。

多重继承比单一继承复杂,它可能导致性的歧义性,以及对virtual 继承的需要

virtual继承会增加大小,速度,初始化,复杂度等等成本,如果virtual base classes不带任何数据,将是最具使用价值的情况

 

多重继承的确有正当用途,其中一个情节设计"public 继承某个interface class"和“private继承某个协助实现的class”的两相组合。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

第六章 继承和面向对象设计 (Effective C++ Second Edition 读书笔记)

条款35: 使公有继承体现 "是一个" 的含义 注释:C++面向对象编程中一条重要的规则是:公有继承意味着 "是一个" 。 条款36: 区分接口继承和实现继承 1) 定义纯虚函数的目的在于,...

Effective C++ 第六章--继承与面向对象设计笔记

条款32确定你的public继承塑模处is-a关系 条款32:确定你的public继承塑模处is-a关系 ”public继承“意味着is-a。

Effective C++笔记(8)—继承与面向对象设计

EffectiveC++ 笔记 继承与面向对象设计

Effective c++(笔记)之继承关系与面向对象设计

Effective c++ 之 继承关系与面向对象设计 提到了在一堆classes中去辨别关系的准则,面向对象设计中容易产生的问题

Effective C++读书笔记 第六部分 继承与面向对象设计

如果你了解C++各种特性的意义,你会发现,你对OOP的看法改变了。它不再是一项用来划分语言特性的仪典,而是可以让你通过它说出你对软件系统的想法。一旦你知道该通过它说些什么,移转至C++世界也就不再是可...
  • lxhjh
  • lxhjh
  • 2013-05-21 13:30
  • 689

Effective C++(六)继承与面向对象设计

六、继承与面向对象设计 条款32:确定你的public继承塑模出is-a关系 1、is-a关系 例子: class Person { ... }; class Student:public ...

Effective C++ --6 继承与面向对象设计

上一篇Effective C++ --5 实现   32、确定你的public继承塑模出is-a关系  (1)public 继承意味着is-a。适用于base class身上的每一件事一定也适...

Effective C++之继承和面向对象设计

6 继承和面向对象设计 条款32:确定你的public继承塑模出is-a关系。 如果你令classD以public形式继承class B,你便是告诉C++编译器说,每一个类型为D的对象同时也是一个...

effective c++之继承与面向对象设计

条款32:确定你的public继承塑模出is-a关系 请记住: 1.   “public继承”意味着is-a。适用于baseclasses身上的每一件事情一定也适用于derived class...

《Effective C++》第六章:继承与面向对象设计

条款32:确定你的public继承塑模出is-a关系 is-a的关系就是说派生类一定是一个基类,额,通俗一点说就是派生类可以当做基类一样来使用。即本章阐述的观点就是,public继承就意味着is-a。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)