Use private inheritance judiciously. 如果classes之间的继承关系是private,编译器不会自动将一个derived class对象转换为一个base class对象.这和public继承的情况不同. 由private base class继承而来的所有成员,在derived class中都会变成private属性,纵使他们在base class中原本是protected或者public属性.…
1. private 继承介绍 Item 32表明C++把public继承当作”is-a”关系来对待.考虑一个继承体系,一个类Student public 继承自类Person,如果一个函数的成功调用需要从Student到Person的隐式转换,这时候“is-a”关系就出现了.对于一部分实例,使用private继承来代替public继承也是有价值的事情: class Person { ... }; class Student: private Person { ... }; // inherit…
Private继承意味is-implemented-in-terms of(根据某物实现出).它通常比复合(composition)的级别低.但是当derived class需要访问protected base class的成员,或需要重新定义继承而来的virtual函数时,这么设计是合理的. 和复合(composition)不同,private继承可以造成empty base最优化.这对致力于“对象尺寸最小化”的程序库开发者而言,可能很重要.…
1.private继承意味着,根据某物实现出,继承父类的实现,关闭父类的接口,并不是Is-A的关系,不满足里氏代换,继承的内容访问权限都修改为private. 2.那么问题来了,复合也表达根据某物实现出,那到底使用private继承还是复合呢? 3.优先使用复合,除非是下面的情况:a.使用对象的protected成员:b.想要重新定义virtual方法. 4.考虑下面的极端情况,有个empty类,占用空间大小为0,也就是说,没有字段和virtual方法,如果使用继承,子类大小不增加.如果使用复合…
(一) (1)private继承意味着"依据某物实现出".仅仅有实现部分被继承.接口部分应略去: (2)它仅仅在软件"实现"层面上有意义,在软件"设计"层面上没有意义. (3)private继承而来的基类成员都会在派生类中成为private属性,纵使它们在base class中原本是protected或public属性: (4)假设类之间是private继承关系.编译器不会自己主动将一个派生类对象转换为基类对象. (5)D类以私有形式继承B类,意…
NOTE: 1.private 继承意味 is-implemented-in-terms-of(根据某物实现出).它通常比复合(composition)的级别低.但是当derivated class需要访问protected base class的 成员,或需要重新定义继承而来的virtual函数时,这么设计是合理的. 2.和复合(composition)不同,private 继承可以造成empty base 最优化.这对致力于“对象尺寸最小化”的程度开发者而言,可能很重要.…
private继承的意义在于“be implemented in turns of”,这个与上一条款中说的复合模型的第二层含义是相同的,这也意味着通常我们可以在这两种设计方法之间转换,但书上还是更提倡使用复合来进行类的设计. private继承与public的继承是完全不同的,主要体现在两个地方: 其一,public继承在子类中保持父类的访问权限,即父类中是public的成员函数或成员变量,在子类中仍是public,对private或者protected的成员函数或成员变量亦是如此:但priva…
187页 private继承意味implementedin-terms-of(根据某物实现出).如果你让class D以private形式继承class B,你的用意为了采用class B内已经备妥的某些特性,不是因为B对象和D对象存在有任何观念上的关系.Private继承纯粹是一种实现技术,(这就是why继承自一个private base class的每样东西在你的class内都是private:因为他们都只是实现枝节而已.) Private继承在软件“设计”层面上没有意义,其意义只及于软件实…
1. 多继承的两个阵营 当我们谈论到多继承(MI)的时候,C++委员会被分为两个基本阵营.一个阵营相信如果单继承是好的C++性质,那么多继承肯定会更好.另外一个阵营则争辩道单继承诚然是好的,但多继承太麻烦,而不值得去使用它.在这个条款中,我的主要目标是让你明白多继承的这两个观点. 2. 从多个基类中继承的名字不能相同 第一件事情是你需要认识到使用MI进行设计时,从多个基类中可能会继承相同的名字(例如函数或者typedef等等).这就会导致模棱两可的问题,例如: class BorrowableI…
首先看一下private继承的法则:class之间的继承关系如果是private的话,那么编译器不会将一个derived对象自动当作为一个base class对象. 从base class继承而来的所有方法以及属性,在derived class都会变成是private的.   private继承的底层含义实际上是:implemented in terms of,通过private继承的主要目的是使得derived class使用base 已经做好的某些东西,但是外部仍然是无法岁base clas…
多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. virtual继承会增加大小.速度.初始化(及赋值)复杂度等等成本.如果virtual base classes不带任何数据,将是最具实用价值的情况. 多重继承的确有正当用途.其中一个情节涉及“public继承某个Interface class"和”private继承某个协助实现的class“的两相组合.…
如果class间使用private继承关系,编译器就不会自动的将派生类转换为基类,而且private继承而来的成员都变为private属性. private继承意味着根据某物实现出,当我们想要避免重复代码,使用现有的代码时,就可以使用private继承. class Widget: private Timer { private: virtual void onTick() const; // look at Widget usage data, etc. ... }; 例如类widget需要使…
private继承并不如public继承一样具有is-a的关系. ---------------------------------------------------------------------------------------------------------------------------- private继承时,编译器不会自动将一个derived class自动转换为一个base class对象: 由private继承而来的所有成员,在derived class中都会变成…
1 private, public, protected 访问标号的访问范围 private:只能由1.该类中的函数.2.其友元函数访问. 不能被任何其他访问,该类的对象也不能访问. protected:可以被1.该类中的函数.2.子类的函数.3.其友元函数访问. 但不能被该类的对象访问. public:可以被1.该类中的函数.2.子类的函数.3.其友元函数访问,也可以由4.该类的对象访问. 注:友元函数包括3种:设为友元的普通的非成员函数:设为友元的其他类的成员函数:设为友元类中的所有成员函数…
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:多重继承比单一继承复杂.它可能导致新的歧义性,以及对 virtual 继承的须要 演示样例: class BorrowableItem{ public: void checkOut(); }; class ElectronicGadget{ private: bool checkOut() const; }; class MP3Player: public BorrowableIte…
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所以JDK 最好下载 JDK 9以上的版本. 52. 明智而审慎地使用重载 下面的程序是一个善意的尝试,根据Set.List或其他类型的集合对它进行分类: // Broken! - What does this program print? public class CollectionClassif…
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所以JDK 最好下载 JDK 9以上的版本. 53. 明智而审慎地使用可变参数 可变参数方法正式名称称为可变的参数数量方法『variable arity methods』 [JLS, 8.4.1],接受零个或多个指定类型的参数. 可变参数机制首先创建一个数组,其大小是在调用位置传递的参数数量,然后将参…
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所以JDK 最好下载 JDK 9以上的版本. 55. 明智而审慎地返回Optional 在Java 8之前,编写在特定情况下无法返回任何值的方法时,可以采用两种方法.要么抛出异常,要么返回null(假设返回类型是对象是引用类型).但这两种方法都不完美.应该为异常条件保留异常(条目 69),并且抛出异常…
多重继承是一种比较复杂的继承关系,它意味着如果用户想要使用这个类,那么就要对它的父类也了如指掌,所以在项目中会带来可读性的问题,一般我们都会尽量选择用单继承去替代它. 使用多重继承过程容易碰到的问题就是名字冲突,像下面这样: class Base1 { public: void fun(){} }; class Base2 { private: void fun(){} }; class Derived : public Base1, public Base2 {}; int main() {…
这里有个demo,里面的Stack<T*> : private Stack<void *>,作者对此的解释如下 The partial specialization for other pointer types derives from Stack<void*> privately, since we aremerely using Stack<void*> for implementation purposes, and do not wish to e…
1:访问控制 1.1 public 这类型成员可以被类本身函数访问,也可以被外部创建的类对象调用.子类对象与子类内部可以访问 1.2 protected类型成员,只能被类本身函数访问.外部创建的类对象没有访问权限.子类对象没有访问权限,子类内部可以访问 1.3 private类型成员,只能被类本身函数访问,外部创建的类对象没有访问权限.子类对象和子类内部都没有访问权限 class TestObject{ public: void Function(); void TestPublic(); pr…
NOTE: 1.多重继承比单一继承复杂.它可能导致新的歧义性,以及对virtual继承的需要. 2.virtual 继承会增加大小 速度 初始化(及赋值)复杂度等等成本.如果virtual base class 不带任何数据,将是最具价值的情况. 3.多重继承的确有正当用途.其中一个情节涉及“public 继承某个interface class”和“private 继承某个协助实现的class”的两相组合.…
访问修饰符 public.protected.private,无论是修饰类内成员(变量.函数),还是修饰继承方式,本质上实现的都是可见性的控制. Difference between private, public, and protected inheritance class A { public: int x; protected: int y; private: int z; }; class B : public A { // x is public // y is protected…
#include<iostream> #include<string> using namespace std; class parent{ protected: int m_a; int m_b; public: int m_c; void set(int a,int b,int c){ m_a = a; m_b = b; m_c = c; } }; class child_A:public parent{ public: void print(){ cout <<…
在某处看到一张图,简单明了的说明了三者的关系,很是佩服,遂记录下来. //公有继承 对象访问 成员访问 public --> public Y Y protected --> protected N Y private --> private N N //保护继承 对象访问 成员访问 public --> protected N Y protected --> protected N Y private --> protected N N //私有继承 对象访问 成员访…
公有继承(public)继承.私有继承(private).保护继承(protected)是常用的三种继承方式. 1.公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问. 2.私有继承(private) 私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问. 3.保护继承 保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,…
公有继承(public).私有继承(private).保护继承(protected)是常用的三种继承方式. 1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问. 2. 私有继承(private) 私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问. 3. 保护继承(protected) 保护继承的特点是基类的所有公有成员和保护成员…
条款35 考虑virtual函数以外的其他选择 记住: ★virtual函数的替代方案包括NVI手法及Strategy模式的多种形式.NVI手法自身是一个特殊形式的Template Method模式 ★将机能从成员函数移到class外部函数,带来的一个缺点是,非成员函数无法访问class的non-public成员 ★tr1::function对象的行为就像一般函数指针.这样的对象可接纳“与给定之目标签名式兼容”的所有可调用物 -----------------------------------…
32.确保你的public继承了模is-a关系 public继承意味着is-a关系(里氏替换原则),一切适用于基类也适用于派生类. 矩形继承正方形问题: 可实施与矩形的操作无法实施与正方形 在编程领域.正方形是一种矩形是错误的 在现实领域,正方形是一种矩形是正确的 33.避免遮盖继承而来的名称 class Base { private: int x; public: virtual void mf1() = 0; virtual void mf1(int); virtual void mf2()…