首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python协议 、鸭子类型 、 抽象 、混入

本篇文章探讨一下python几个概念:协议 、鸭子类型 、 抽象 、混入。 一、协议 在python,协议是一个或一组方法。...二、鸭子类型(duck typing) 多态一种形式,在这种形式,对象类型无关紧要,只要实现了特定协议即可。...三、抽象 抽象就是定义各种方法而不做具体实现,任何继承自抽象必须实现这些方法,否则无法实例化。 那么抽象这样实现目的是什么呢? 假设我们在写一个关于动物代码。...示例2定义了一个抽象 Animal,它包含两个抽象方法eat和voice,Dog和Bird都继承了Animal,并各自实现了具体eat和voice方法。...print(issubclass(Cat, Animal)) 输出: True 这种通过注册和抽象关联起来叫做虚拟子类,虚拟子类不会继承注册抽象,而且任何时候都不会检查它是否符合抽象接口

1.8K20

C++】泛型编程 ⑧ ( 模板继承语法 | 普通 继承 模板语法 | 模板 继承 模板语法 | 继承模板必须指定具体类型参数列表 | 继承 模板 必须重写构造函数 )

子类 : // 模板 继承时 , 需要具体化 模板 // 也就是 指定 模板 类型参数列表 , 将 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父占用内存大小..., 继承上述模板 , 模板子类 与 普通子类 区别就是 , 模板子类 需要在尖括号中指定 具体 类型参数列表 数据类型 ; 此时 , 在继承时 , 被继承 模板 必须 声明 类型参数列表..., 将具体泛型类型写在尖括号 , C++ 编译器需要知道 具体 数据类型 是什么 , 才能生成 具体 , 只有这样 , 将具体数据类型固定下来 , C++ 编译器 才能知道 父 所占...二、模板 继承 模板语法 1、模板 继承 模板语法 普通 继承 模板时 , 需要指定 模板 具体 参数类型 , 下面代码 具体类型就是 int ; class Son : public... 泛型 T , 与 Father T 没有任何关系 , 也就是说 Son2 泛型类型 T 相当于 普通 继承 模板 具体类型 int , Father 泛型 T 已经被覆盖掉了

40930
您找到你想要的搜索结果了吗?
是的
没有找到

C++继承 ⑥ ( 继承构造函数和析构函数 | 类型兼容性原则 | 父指针 指向 子类对象 | 使用 子类对象 为 父对象 进行初始化 )

一、public 公有继承 - 示例分析 1、类型兼容性原则 类型兼容性原则 : C++ " 类型兼容性原则 “ 又称为 ” 赋值兼容性原则 " ; 子类代替父 : 需要 ( 父 ) 对象...地方 , 都可以使用 " 公有继承 " 派生 ( 子类 ) 对象 替代 , 该 派生 ( 子类 ) 得到了 除 构造函数 和 析构函数 之外 所有 成员变量 和 成员方法 ; 功能完整性 :..." 公有继承 " 派生 ( 子类 ) 本质上 具有 ( 父 ) 完整功能 , 使用 可以解决问题 , 使用 公有继承派生 都能解决 ; 特别注意 : " 保护继承 " 和..." 私有继承 " 派生 , 是 不具有 完整功能 , 因为 最终继承派生 , 无法在 外部调用 父 公有成员 和 保护成员 ; 2、类型兼容性原则应用场景 " 类型兼容性原则...子类对象 , 父指针 值为 子类对象 在 堆内存 地址 , 也就是 将 子类对象 地址 赋值给 父类型指针 ; 引用 : 父引用 引用 子类对象 , 将 子类对象 赋值给 父类型引用 ; 二

20320

C++】异常处理 ⑦ ( 异常继承层次结构 | 抛出 捕获 多个类型异常对象 | 抛出子类异常对象 捕获并处理 父异常对象 )

自定义 异常 , 可能存在 继承结构 , 也就是说 在 同一个 try-catch 代码块 , 如果需要 拦截 和 处理多个 异常时 , 如果 这些异常都继承相同 , 只需要拦截一个 父异常即可..., 本篇博客 , 讨论 抛出 / 捕获 异常 存在 继承结构 情况 ; 一、抛出 / 捕获 多个类型异常对象 1、抛出 / 捕获 多个类型异常对象 定义一个函数 , 传入一个 int 类型参数...二、异常继承层次结构 1、抛出子类异常对象 / 捕获并处理 父异常对象 如果 抛出 / 捕获 多个类型异常对象 , 每次拦截处理异常时 , 都要手动编写多个 catch 分支 , 不利于代码维护...; 如果将 相似类型异常 都继承自 一个父 , 那么每次拦截时 , 只需要拦截一个父异常即可 ; 定义父异常 , 其中定义一个纯虚函数 , 该纯虚函数是异常打印 , 或者异常处理通用操作 ;..., 会发生多态 ; 在拦截父对象时 , 调用不同 异常对象 , 会分别调用不同子类 虚函数方法 ; 抛出异常函数如下 , 抛出异常时 , 需要抛出子类异常对象 ; // 1.

14810

设计模式 - 模板方法模式

模板方法 模板方法模式是一种行为设计模式, 它在超定义了一个算法框架, 允许子类在不修改结构情况下重写算法特定步骤。...模板方法模式利用C++多态特征,在父定义一套结构流程,其中通用部分在父实现,子类继承实现差异性接口。...,子类只需要继承实现具体接口即可。...但其后果就是, 只要算法发生变化, 你就可能需要修改所有的。undefined在将算法转换为模板方法时, 可将相似的实现步骤提取到超以去除重复代码。子类间各不同代码可继续保留在子类。...本例程为了方便没有将独立出来,实际应用应将此放在独立头文件,方便引用。

31420

C++设计模式 - 模板方法模式

模板方法 ❝模板方法模式是一种行为设计模式, 它在超定义了一个算法框架, 允许子类在不修改结构情况下重写算法特定步骤。...❞ 模板方法模式利用C++多态特征,在父定义一套结构流程,其中通用部分在父实现,子类继承实现差异性接口。...,子类只需要继承实现具体接口即可。...但其后果就是, 只要算法发生变化, 你就可能需要修改所有的。 在将算法转换为模板方法时, 可将相似的实现步骤提取到超以去除重复代码。子类间各不同代码可继续保留在子类。...本例程为了方便没有将独立出来,实际应用应将此放在独立头文件,方便引用。 最后 用心感悟,认真记录,写好每一篇文章,分享每一框干货。

38530

cc++问题集四

,如果都没有虚函数,就是特属子类虚函数指针 image.png image.png image.png 2、c++泛型编程 泛型在C++主要实现为模板函数和模板。...多态: 用于子类之间指针或引用转换。把子类指针或引用转换为表示时(向上转换)是安全;但把指针或引用转换为子类表示时(向下转换),由于没有进行动态类型检测,所以是不安全。...4、虚继承 在菱形继承,有多重继承问题,从不同途径继承同一,会在子类存在多份拷贝。这将存在两个问题:其一,浪费存储空间;第二,存在二义性问题。...虚继承一般通过虚指针和虚表实现,每个虚继承子类都有一个虚指针vbptr(占用一个指针存储空间,4字节)和虚表(不占用对象存储空间)(多重虚继承还是单一虚继承,指向虚指针都只有一个...);当虚继承子类被当做父继承时,虚指针也会被继承,如果是多重继承那就会有多个虚指针。

73840

《Effective C++》学习笔记

或者继承一个类似uncopyable,该相应函数为private且不予实现,这样子类调用时会去调用该函数,从而被编译器拒绝。...此时再通过子类使用其重载函数(子类没有声明接收该参数重载函数时),都会报错。...对于嵌套从属类型名称(即依赖于模板参数类型一个子类型,例如迭代器),必须用typename来修饰,但不能在模板列和初始化列表修饰。...解决方法有: 在调用动作前加上“this->” 使用using声明式来在子类声明基该接口 明确指出被调用函数位于:Base::xxx(); 以上做法都是承诺被调用函数一定会在各种特化均声明...条款46:需要类型转换时请为模板定义非成员函数 模板模板函数不支持隐式类型转换,如果你在调用时传了一个其他类型变量,编译器无法帮你做类型转换,从而报错。

1.1K20

《Effective C++》读书摘要

,而非子类; 需要子类构造信息解决方案:子类使用静态函数构造参数。...(六)、继承与面向对象设计 三十二、确定public继承塑膜出is-a关系 适用于事情也适用于子类。 三十三、避免遮掩继承名称 重载函数一旦在子类被重写后,其他同名函数无法访问。...这样Widget子类就不会修改onTick函数了,将内部类移出,换做声明可以降低耦合; private继承大小实际为0,一般对象大小不能为0; 需要protected成员或者重写虚函数时候可以考虑使用...四十二、typename双重含义 模板声明与class没有任何区别; 嵌套从属类型显式指定,不能出现在列表和初始化列表; ?...四十三、处理模板名称 继承模板名称不能像继承一样使用:通过this->名字修饰、using ::名字、或者::名字一共三种修饰方式。第三种导致虚函数功能失效。

1.9K60

《逆袭进大厂》第三弹之C++提高篇79问79答

1) 向上类型转换 将派生指针或引用转换为指针或引用被称为向上类型转换,向上类型转换会自动进行,而且向上类型转换是安全。...2) 向下类型转换 将指针或引用转换为派生指针或引用被称为向下类型转换,向下类型转换不会自动进行,因为一个对应几个派生,所以向下类型转换时不知道对应哪个派生,所以在向下类型转换时必须加动态类型识别技术...2) 三种继承方式 ① 若继承方式是public,成员在派生访问权限保持不变,也就是说,成员访问权限,在派生仍然保持原来访问权限; ② 若继承方式是private,所有成员在派生访问权限都会变为私有...虚函数需要在中加上virtual修饰符修饰,因为virtual会被隐式继承,所以子类相同函数都是虚函数。...C++继承:B公有继承A { virtual void fun() //C++多态:通过虚函数实现(子类关键字virtual可加可不加) { cout<<"B:fun

2.2K30

《逆袭进大厂》之C++篇49问49答

子类1继承并重写了函数,子类2继承但没有重写函数,从结果分析子类体现了多态性,那么为什么会出现多态性,其底层原理是什么?这里需要引出虚表和虚表指针概念。...类型说明符,用它就能让编译器我们去分析表达式所属类型。...派生成员访问形象有如下两种: 内部访问:由派生中新增成员函数对从继承成员访问 外部访问:在派生外部,通过派生对象对从继承成员访问 (二)继承权限 public继承...公有继承特点是公有成员和保护成员作为派生成员时,都保持原有的状态,而私有成员任然是私有的,不能被这个派生子类所访问 protected继承 保护继承特点是所有公有成员和保护成员都成为派生保护成员...,并且只能被它派生成员函数或友元函数访问,私有成员仍然是私有的. private继承 私有继承特点是所有公有成员和保护成员都成为派生私有成员,并不被它派生子类所访问,成员只能由自己派生访问

1.9K10

《逆袭进大厂》之C++篇49问49答(绝对干货)

子类1继承并重写了函数,子类2继承但没有重写函数,从结果分析子类体现了多态性,那么为什么会出现多态性,其底层原理是什么?这里需要引出虚表和虚表指针概念。...类型说明符,用它就能让编译器我们去分析表达式所属类型。...派生成员访问形象有如下两种: 内部访问:由派生中新增成员函数对从继承成员访问 外部访问:在派生外部,通过派生对象对从继承成员访问 (二)继承权限 public继承...公有继承特点是公有成员和保护成员作为派生成员时,都保持原有的状态,而私有成员任然是私有的,不能被这个派生子类所访问 protected继承 保护继承特点是所有公有成员和保护成员都成为派生保护成员...,并且只能被它派生成员函数或友元函数访问,私有成员仍然是私有的. private继承 私有继承特点是所有公有成员和保护成员都成为派生私有成员,并不被它派生子类所访问,成员只能由自己派生访问

2.5K40

C语言与C++面试知识总结

带纯虚函数叫抽象,这种类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。抽象继承后,子类可以继续是抽象,也可以是普通。 虚是虚继承,具体见下文虚继承。...底层实现原理与编译器相关,一般通过虚指针和虚表实现,每个虚继承子类都有一个虚指针(占用一个指针存储空间,4字节)和虚表(不占用对象存储空间)(需要强调是,虚依旧会在子类里面存在拷贝...,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承子类被当做父继承时,虚指针也会被继承。...虚继承、虚函数 相同之处:都利用了虚指针(均占用存储空间)和虚表(均不占用存储空间) 不同之处: 虚继承依旧存在继承,只占用存储空间 虚表存储是虚相对直接继承偏移 虚函数...虚函数不占用存储空间 虚函数表存储是虚函数地址 模板、成员模板、虚函数 模板可以使用虚函数 一个(无论是普通还是模板成员模板(本身是模板成员函数)不能是虚函数 抽象、接口、聚合

4.9K41

什么?CC++面试过不了?因为你还没看过这个!

带纯虚函数叫抽象,这种类不能直接生成对象,而只有被继承,并重写其虚函数后,才能使用。抽象继承后,子类可以继续是抽象,也可以是普通。 虚是虚继承,具体见下文虚继承。...底层实现原理与编译器相关,一般通过虚指针和虚表实现,每个虚继承子类都有一个虚指针(占用一个指针存储空间,4字节)和虚表(不占用对象存储空间)(需要强调是,虚依旧会在子类里面存在拷贝...,只是仅仅最多存在一份而已,并不是不在子类里面了);当虚继承子类被当做父继承时,虚指针也会被继承。...虚继承、虚函数 相同之处:都利用了虚指针(均占用存储空间)和虚表(均不占用存储空间) 不同之处: 虚继承依旧存在继承,只占用存储空间 虚表存储是虚相对直接继承偏移 虚函数...虚函数不占用存储空间 虚函数表存储是虚函数地址 模板、成员模板、虚函数 模板可以使用虚函数 一个(无论是普通还是模板成员模板(本身是模板成员函数)不能是虚函数 抽象、接口、聚合

3.6K50

C++多态两种形式

C++多态性具体体现在编译和运行两个阶段。编译时多态是静态多态,在编译时就可以确定使用接口。运行时多态是动态多态,具体引用接口在运行时才能确定。 ?...封装可以使得代码模块化,继承可以扩展已存在代码,他们目的都是为了代码重用。而多态目的则是为了接口重用。静态多态,将同一个接口进行不同实现,根据传入不同参数(个数或类型不同)调用不同实现。...如果没有使用虚函数,即没有利用C++多态性,则利用指针调用相应函数时候,将总被限制在函数本身,而无法调用到子类中被重写过函数。...,调用函数是子类重写函数,这样就实现了运行时函数地址动态绑定,即动态联编。...动态多态是通过“继承+虚函数”来实现,只有在程序运行期间(非编译期)才能判断所引用对象实际类型,根据其实际类型调用相应方法。

3.9K11

C++补充知识&C++11及其特性

dynamic_cast 动态类型转换 将一个对象指针cast到继承指针,dynamic_cast 会根据指针是否真正指向继承指针来做相应处理。...(子类* xx = dynamic_cast(父xx); 将一个对象引用cast 继承对象,dynamic_cast 会根据对象是否真正属于继承来做相应处理。...建议: C语言中 能隐式类型转换,在c++可用 static_cast()进行类型转换。...因C++编译器在编译检查一般都能通过;C语言中不能隐式类型转换,在c++可以用 reinterpret_cast() 进行强制类型解释**。...3.dynamic_cast(),动态类型转换,安全子类之间转换;运行时类型检查 4.const_cast(),去除变量只读属性 ---- 程序员必须清楚知道: 要转变量,类型转换前是什么类型

37310

C++四种多态

本文转载自The Four Polymorphisms in C++ C++四种多态 当人们谈论C ++多态性时,通常是指通过指针或引用使用派生事情,这称为子类型多态性。...在本文中,我将通过C ++语言示例来说明所有多态性,并深入介绍为什么它们具有其他各种名称。 子类型多态性(运行时多态子类型多态是每个人在C ++说“多态”时所理解。...由于它们都是Felidae生物学家族,并且都应该能够喵叫,因此可以将它们表示为从Felid继承并覆盖meow纯虚拟功能, // file cats.h class Felid { public...参数多态性(编译时多态性) 参数多态性提供了一种对任何类型执行相同代码方法。 在C ++,参数多态性是通过模板实现。...,因为派生已转换为类型

1.2K20

必知必会之C++多态机制

动态多态(运行时多态): 主要是通过虚函数和继承实现,例如,指针指向派生对象,并调用虚函数。在运行时,根据对象实际类型来决定调用哪个版本函数。这种多态性在运行时才会确定。...派生重写虚函数: 派生可以通过重写(覆盖)虚函数来提供自己实现。在调用这个虚函数时,会根据对象实际类型来决定调用哪个版本函数。...unsetunset父指针指向子类对象unsetunset 在 C++ ,可以使用父指针来指向子类对象,这是实现多态一种常见方式。...方法调用 在 C++ ,如果父通过指针或引用调用一个虚函数,而这个虚函数在子类中被重写(override),那么调用实际方法将取决于指针或引用所指向对象类型。这就是多态体现。...具体来说,如果父指针或引用指向子类对象,那么调用方法将是子类重写版本;如果指针或引用指向是父对象,那么调用方法将是父版本。

9610

计算机考研复试C语言常见面试题「建议收藏」

2、C++和C区别 设计思想上: C++是面向对象语言,而C是面向过程结构化编程语言 语法上: C++具有封装、继承和多态三种特性 C++相比C,增加了许多类型安全功能,比如强制类型转换、 C+...4、重写和重载 5、面向对象编程 (1)封装:将数据或函数集合在一个。 (2)继承子类可以继承一些数据和函数。 (3)多态:运行时,可以通过指向指针,调用派生方法。...class可以声明模板,而struct不可以。 9、c++模板 模板就是实现代码重用机制一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正代码可重用性。...为什么C++默认析构函数不是虚函数 析构函数设置为虚函数可以保证我们new一个子类时,可以使用指针指向该子类对象,释放指针时可以释放掉子类空间,防止内存泄漏。...19、构造和析构顺序 构造: 成员对象构造函数 构造函数 子类成员对象构造函数 子类构造函数 析构: 子类析构函数 子类成员析构函数 析构函数 成员析构函数 两者正好相反

1.5K30

C++之面向对象语法笔记

前言 最近项目在开发涉及到C++内容相对比较多,整理一下,过程中用到C++面向对象语法笔记 正文 知识点概要 C++ & 对象 值传递&引用传递 拷贝构造函数 继承& 多态 友元 模板 类型转换...这个已有的称为,新建称为派生C++ 继承继承就是和派生关系。...先调用父构造函数 //2.释放时先调用子类析构函数 //子类没有 就使用父方法 //子类有实现,就是用子类重写 //父类型引用 赋值子类型对象 方法都是父类型方法 void funExtends...当使用不同类型继承时,遵循以下几个规则: 继承类型 说明 public 当一个派生自公有时,公有成员也是派生公有成员,保护成员也是派生保护成员,私有成员不能直接被派生访问...C++多态性用一句话概括就是:在函数前加上virtual关键字,在派生重写该函数,运行时将会根据对象实际类型来调用相应函数。

1.5K40
领券