派生类

C++实现多态的原理

感情迁移 提交于 2019-11-29 06:48:46
C++的多态是面向对象编程的核心,那么C++的多态是怎么来实现的?今天我们就来探讨一下。 我们先来看下面程序和它的运行结果 #include using namespace std; class Father { public: void fun() { cout << “I am father!” << endl; } }; class Son:public Father { public: void fun() { cout << “I am son!” << endl; } }; int main() { Son son; Father *Pfather= &son; Pfather->fun(); system(“pause”); return 0; } 我相信很多人可能会误将它和C++的多态搞混,认为Son的对象son应该调用Son的成员函数,但事实却不是如此,这是为什么呢? 答:从编译器的角度看: C++编译器在编译时,会确定每个对象调用函数(非虚函数)的地址,这叫做早期绑定(也叫做静态绑定)。 当我们定义了派生类的对象,并取它的地址赋值给基类的指针,这时编译器会自动为派生类对象进行类型转换,将派生类对象转换为基类对象,站在内存的角度来看,访问的就是基类的成员。这是因为派生类的对象的对象模型如下: 基类的成员属于派生类成员的一部分,那么父类和子类的成员变量如何初始化呢

《敏捷软件开发──原则、模式与实践》阅读笔记

自闭症网瘾萝莉.ら 提交于 2019-11-29 05:16:23
《敏捷软件开发──原则、模式与实践》阅读笔记 /*--> */ /*--> */ 《敏捷软件开发──原则、模式与实践》阅读笔记 Table of Contents 1. 敏捷开发 1.1. 敏捷联盟宣言 1.2. 敏捷开发的原则 2. 极限编程 3. 设计原则 3.1. 单一职责原则(SRP) 3.2. 开放——封闭原则(OCR) 3.2.1. 遵循开放──封闭原则设计出的模块具有两个主要的特征 3.3. Liskov替换原则(LSP) 3.4. 依赖倒置原则(DIP) 3.5. 接口隔离原则(ISP) 4. 常用设计模式 4.1. Command模式和Active Object 4.1.1. Command模式的优点 4.1.2. Active Object模式 4.2. Template Method模式和Strategy模式:继承和委托 4.2.1. Template Method模式 4.2.2. Strategy模式 4.2.3. 对比 4.3. Facade模式和Mediator模式 4.3.1. facade模式 4.3.2. Mediator模式 4.3.3. 对比 4.4. Singleton模式和Monostate模式 4.4.1. Singleton模式 4.4.2. Monostate模式 4.4.3. 对比 4.5. Null Object模式 4.6.

11).C#_所有类都派生自object类

吃可爱长大的小学妹 提交于 2019-11-29 01:49:41
除了特殊的类object,所有的类都是派生类,即使它们没有基类规格说明.类object是唯一的非派生类,因为它是继承层次结构的基础. 没有基类规格说明的类隐式地直接派生自类object.不加基类规格说明只是指定object为基类的简写.这两种形式都是语义等价的. 关于类继承的其他重要内容如下. 1).一个类声明的基类规格说明中只能有一个单独的类.这称为单继承. 2).虽然类只能直接继承一个基类,但继承的层次没有限制.也就是说,作为基类的类可以派生自另外一个类,而这个类又派生自另一个类,一直下去,直到最终到达object. 基类和派生类是相对的属于.所有的类都是派生类,要么自object,要么派生自其他的类,所以,通常当我们称一个类为派生类时,我们的意思是它直接派生自某类而不是object 来源: https://www.cnblogs.com/linchenjian/p/11438449.html

虚继承

。_饼干妹妹 提交于 2019-11-29 01:43:55
  尽管在派生列表中同一个基类只能出现一次,但实际上派生类可以多次继承同一个类。派生类可以通过它的两个直接基类分别继承同一个间接基类,也可以直接继承某个基类,然后通过另一个基类再一次间接继承该类。   举个例子,IO标准库的istream和ostream分别继承了一个共同的名为base_ios的抽象基类。该抽象基类负责保存流的缓冲内容并管理流的条件状态。iostream是另外一个类,它从istream和ostream直接继承而来,可以同时读写流的内容。因为istream和ostream都继承自base_ios,所以iostream继承了base_is两次,一次是通过istream,另一次是通过ostream。   在默认情况下,派生类中含有继承链上每个类对应的子部分。如果某个类在派生过程中出现了多次,则派生类中将包含该类的多个子对象。   这种默认的情况对某些形如iostream的类显然是行不通的。一个iostream对象肯定是希望在同一个缓冲区进行读写操作,也会要求条件状态能同时反映输入和输出操作的情况。假如在iostram对象中真的包含了base_ios的两份拷贝,则上述的共享行为就无法实现而了。    在C++语言中我们通过虚继承(virtual inheritance)的机制解决上述问题。虚继承的目的是令某个类做出声明,承诺愿意共享它的基类。其中,共享的基类子对象成为虚基类

C++继承:共有,私有,保护

旧城冷巷雨未停 提交于 2019-11-29 00:47:35
C++继承:共有,私有,保护 公有继承(public)、私有继承(private)、保护继承(protected)是常用的三种继承方式。 1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的,不能被这个派生类的子类所访问。 2. 私有继承(private) 私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。 3. 保护继承(protected) 保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。 下面列出三种不同的继承方式的基类特性和派生类特性。 public protected private 共有继承 public protected 不可见 私有继承 private private 不可见 保护继承 protected protected 不可见 在上图中:1)基类成员对派生类都是:共有和保护的成员是可见的,私有的的成员是不可见的。 2)基类成员对派生类的对象来说:要看基类的成员在派生类中变成了什么类型的成员。如:私有继承时,基类的共有成员和私有成员都变成了派生类中的私有成员,因此对于派生类中的对象来说基类的共有成员和私有成员就是不可见的。

多重继承

吃可爱长大的小学妹 提交于 2019-11-29 00:07:50
在派生类的派生列表中可以包含多个基类: class Bear : public ZooAnimal { /* ... */ }; class Panda : public Bear, public Endangered { /* ... */ }; 每个基类包含一个可选的访问修饰符。一如往常,如果访问说明符被忽略了,则关键字class对应的默认访问说明符是private,关键字struct对应的是public。   和只有一个基类继承一样,多重继承的派生列表也只能包含已经被定义过的类,而且这些类只能是final的。对于派生类能够继承的基类个数,C++没有进行特殊的规定;但是在某个给定的派生类表中,同一个基类只能出现一次。 多重继承的派生类从每个基类中继承状态   在多重继承关系中,派生类的对象含有每个基类的子对象。 派生类构造函数初始化所有基类   构造一个派生类对象将同时构造并初始化它的所有基类子对象。与从一个基类进行派生一样,多重继承的派生类的构造函数初始值也只能初始化它的直接基类。 //显示地初始化所有基类 Panda::Panda(std::string name, bool onExhibit) : Bear(name, onExhibit, "Panda"), Endangered(Endangered::critical) {} /

private protected的区别 static的说明

≯℡__Kan透↙ 提交于 2019-11-28 18:44:14
  在类中,由private修饰的属性或者方法只能在该类内部访问,无法在派生类或者外部访问。   由protecred修饰的属性可以在派生类中访问,但是无法在外部访问。   通常使用protected修饰construction构造函数,使得其只能在派生类中访问而无法在外部访问。   以上两个修饰词都是在类被实例化时才会被修饰,而static则存在于类本身上。 来源: https://www.cnblogs.com/potatorain/p/11421034.html

C++多态

跟風遠走 提交于 2019-11-28 16:33:14
多态 概念:不同的对象去完成时会产生处不同的状态 定义与实现: class Person { public: virtual void BuyTicket() { cout << "买票-全价" << endl; } }; class Student : public Person { public: virtual void BuyTicket() { cout << "买票-半价" << endl; } /*注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后 基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用*/ /*void BuyTicket() { cout << "买票-半价" << endl; }*/ }; void Func(Person& p) { p.BuyTicket(); } int main() { Person ps; Student st; Func(ps); Func(st); return 0; } 要构成多态还有两个条件: 1. 必须通过基类的指针或者引用调用虚函数 2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写(父类中必须是虚函数,派生类可以不是) 注意: 父类中的virtual去掉,则构成 隐藏/重定义 派生类中的virtual去掉

Python之面向对象(五)类的成员

笑着哭i 提交于 2019-11-28 16:24:17
6.8 面向对象之:类的成员 细分类的组成成员 类大概分为两块区域,如下 class A: name="haha"#第一部分 静态字段(静态变量) def __init__(self):#第二部分 方法部分 pass def func(self):#第二部分:方法部分 pass 具体可以细分为: class A: company_name="haha" #静态变量 (静态字段) _iphone="564545"#私有静态变量(私有静态字段) def __init__(self,name,age):#特殊方法 self.name=name#对象属性 self._age=age#私有对象属性(私有普通字段) def func1(self):#普通方法 pass def __func(self):#私有方法 print(666) @classmethod#类方法 def class_func(cls): """定义类方法,至少有一个cls参数""" print('类方法') @staticmethod#静态方法 def static_func(): """定义静态方法,无默认参数""" print("静态方法") @property#属性 def prop(self): pass 类的私有成员 对于每个类的成员而言都有两种形式:公有成员:在任何地方都能访问;私有成员

定义基类和派生类

自闭症网瘾萝莉.ら 提交于 2019-11-27 21:53:29
成员函数与继承   在C++语言中,基类必须将它的两种成员函数区分开来:一种是基类希望派生类进行覆盖的函数;另一类是基类希望派生类直接继承而不要改变的函数。对于前者,基类通常将其定义成虚函数(virtual)。当我们使用指针或引用调用虚函数时,该调用将被动态绑定。根据引用或指针所绑定的对象类型不同,该调用可能执行基类版本,也可能执行某个派生类版本。   基类通过在其成员函数的声明语句之前加上关键字virtual使得该函数执行动态绑定。 任何构造函数之外的非静态函数都可以是虚函数。 关键字virtual只能出现在类内部的声明语句而不能用于类外部的函数定义。 如果基类把一个函数声明成虚函数,则该函数在派生类中隐式也是虚函数。   成员函数如果没有被声明为虚函数,则其解析过程发生在编译时而非运行时。 访问控制与继承 来源: https://www.cnblogs.com/bootblack/p/11379293.html