//###########################################################################
/*
* 公有继承的两元性
*
* - 接口的继承
* - 实现的继承
*/ class Dog {
public:
virtual void bark() = 0; //只继承了接口
void run() { cout << "I am running."; } //既继承了接口,也继承了实现
virtual void eat() { cout << "I am eating. "; }
protected:
void sleep() { cout << " I am sleeping. "; } //只继承了实现,没继承接口
}; class Yellowdog : public Dog{
public:
virtual void bark() { cout << "I am a yellow dog.\n";}
void iSleep() { sleep(); }
}; /*
* C++中继承的类型:
* 1. 纯虚公有函数 - 只继承接口
* 2. 非虚公有函数 - 继承接口和实现
* 3. 非纯虚公有函数 - 继承接口和默认实现
* 4. 保护函数 - 只继承实现
*
* 作为程序设计师,有必要分清接口和实现的概念
*/ /*
* 接口继承用于
*
* 1. Subtyping
* 2. Polymorphism
*/
virtual void bark() = 0; /*
* 陷阱:
* -- 小心接口膨胀
* -- 接口不应该显示实现
*/ /*
* 实现继承
* - 会增加代码的复杂性 //在写派生类的时候需要关注基类,在改基类的时候的还要时刻小心有没有破坏派生类
* - 不鼓励Not encouraged
*/
public:
void run() { cout << "I am running."; }
virtual void eat() { cout << "I am eating. "; }
protected:
void sleep() { cout << " I am sleeping. "; } /*
* 实现继承的指导原则:
* 1. 不要为了代码重用而使用继承,使用组合替代
* 2. 最小化基类的实现,基类要小巧
* 3. 最小化实现继承的层数
*/ /*
* 继承是否是魔鬼 ???
*
* 继承有时候有用,但是往往过度使用了
*/

C++进阶--公有继承的二元性的更多相关文章

  1. C++公有继承、私有继承以及友元

    公有继承: 基类的成员在派生类中维持原来的访问权限,基类的publice成员为派生类的public成员,基类的protected成员为派生类的protected成员,基类的private成员在派生类的 ...

  2. C++公有继承

    is-a.has-a和like-a.组合.聚合和继承 两组概念的区别 - cbk861110的专栏 - 博客频道 -CSDN.NET http://blog.csdn.net/cbk861110/ar ...

  3. ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase

    原文地址:http://www.51csharp.com/MVC/882.html   ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL 引言-- 在初级篇中,我们 ...

  4. C++学习笔记14,private/protected/public继承,私有继承,保护继承,公有继承(五)(总结)

    各种继承方式: 特征 公有继承 保护继承 私有继承 公有成员变为 派生类的公有成员 派生类的保护成员 派生类的私有成员 保护成员变为 派生类的保护成员 派生类的保护成员 派生类的私有成员 私有成员变为 ...

  5. C++ 中私有继承、保护继承与公有继承

    区别 下面通过一个示例来介绍三种继承的区别. 定义一个基类(假设为一个快退休的富豪): class RichMan { public: RichMan(); ~RichMan(); int m_com ...

  6. C++中公有继承、保护继承、私有继承的区别

    公有继承时基类中各成员属性保持不变,基类中private成员被隐藏.派生类的成员只能访问基类中的public/protected成员,而不能访问private成员:派生类的对象只能访问基类中的publ ...

  7. C++公有继承、保护继承和私有继承

    C++中的继承方式有: public.private.protected三种(它们直接影响到派生类的成员.及其对象对基类成员访问的规则). (1)public(公有继承):继承时保持基类中各成员属性不 ...

  8. C++_类继承2-多态公有继承

    有时候希望同一个方法在派生类和基类中的行为是不同的.换句话说,方法的行为取决于调用该方法的对象.这种较复杂的行为称为多态——具有多种形态.即同一种方法其行为随上下文而异.有两种重要的机制可用于实现多态 ...

  9. c++ 公有继承的赋值兼容规则

    赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代.通过公有继承,派生类得到了基类中除构造函数.析构函数之外的所有成员,而且所有成员的访问控制属性也和基类完全相同.这样,公有派生 ...

随机推荐

  1. re.compile

    详情见 >>> import re >>> s = "adfad asdfasdf asdfas asdfawef asd adsfas " & ...

  2. day03用户交互、基本数据类型、运算符

    用户交互 在实际应用中,我们经常需要用户输入相应信息,根据用户输入信息进行反馈,此时我们需要input/output信息 python中提供了便捷的输入方法input()和print() 在pytho ...

  3. active在iphone上不起作用

    在js中加一个空的touchstart函数 $(function(){ document.body.addEventListener('touchstart',function(){ }); 或在&l ...

  4. MVC分别代表的含义

    MVC 是一种将应用程序的逻辑层和表现层进行分离的方法.ThinkPHP 也是基于MVC设计模式的.MVC只是一个抽象的概念,并没有特别明确的规定,ThinkPHP中的MVC分层大致体现在:模型(M) ...

  5. java-Integer类

    1.为什么会有基本类型包装类 * 将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据. 2.常用操作 * 常用的操作之一:用于基本数据类型与字符串之间的转换. * Intege ...

  6. SSAS aggregation 的作用及其使用

    作用: 聚合是为了解决查询在运行时的效率低下,在数据立方体部署的时候进行聚合,实际上是对数据立方体的预处理,方便以后查询.如若在部署时未进行聚合,则在以后每次查询时实际上都会进行一次集合的操作,等待结 ...

  7. oracle 数据库备份、还原、和使用心得(表丢失、视图丢失的解决办法)

    一.oracle数据备份:exp 关键字     说明(默认值)                  关键字      说明(默认值) --------------------------------- ...

  8. word怎么在方框中打对号

    最快最简单的方法,是在word里输入一个大写的R,然后选中并将字体改为wingdings2,至于那个带叉号的方框图形,可以输入大写字母T并将字体设置为windings2

  9. skipper prometheus 监控

    skipper 是支持prometheus监控的,只是没有启用,需要添加参数 -enable-prometheus-metrics 测试使用的是一个简单nginx web ,同时使用docker-co ...

  10. C# to IL 1 Introduction to Microsoft’s IL(MSIL 介绍)

    The code that we write in a programming language like C#, ASP+ or in any other .NETcompatible langua ...