多态

虚函数注意事项和多态构成条件

柔情痞子 提交于 2020-03-02 20:50:08
虚函数只需要在声明处加vitrual关键字,注意是声明处 为了方便,可以只将基类中的函数声明为虚函数,这样所有派生类中具有遮蔽关系的同名函数都将自动成为虚函数,多继承的时候需要小心。 当在基类中定义了虚函数时,如果派生类没有定义新的函数来遮蔽此函数,那么将使用基类的虚函数。 只有派生类的虚函数覆盖基类的虚函数(函数原型相同)才能构成多态(通过基类指针访问派生类函数) 构造函数不能是虚函数 析构函数可以声明为虚函数,而且**有时候必须要声明为虚函数 ** 基类虚函数重载,子类必须遮蔽时(即将父类的重载函数遮蔽)才会调用子类函数 //基类Base class Base { public : virtual void func ( ) ; virtual void func ( int ) ; } ; void Base : : func ( ) { cout << "void Base::func()" << endl ; } void Base : : func ( int n ) { cout << "void Base::func(int)" << endl ; } //派生类Derived class Derived : public Base { public : void func ( ) ; void func ( char * ) ; } ; void Derived

多态

↘锁芯ラ 提交于 2020-03-02 18:21:23
前面讲了父类指针指向子类对象时,可以访问子类的成员变量(从父类继承过来的成员变量),但是成员函数(从父类继承过来的成员函数)时,依旧访问的是父类的成员函数。 (我们说这是因为,成员函数并没有存如到对象的内存中,而是在全局数据区)。 为了解决这个问题,c++增加了虚函数。注意是 虚函数 不是虚继承 虚继承是在出现菱形继承时,在继承方式前面加virtual,保证父类成员只出现一次 在初始化时调用间接基类进行初始化。 虚函数是为了让父类指针指向子类对象时,可以使用子类的成员函数。 使用虚函数 只需要在函数声明前 面增加 virtual 关键字。 有了虚函数,基类指针指向基类对象时就使用基类的成员(包括成员函数和成员变量),指向派生类对象时就使用派生类的成员。它有多种形态,或者说有多种表现方式,我们将这种现象称为多态(Polymorphism)。 多态的目的 通 过基类指针对所有派生类(包括直接派生和间接派生)的成员变量和成员函数进行“全方位”的访问,尤其是成员函数。如果没有多态,我们只能访问成员变量。 using namespace std ; class A { public : A ( ) : m_a ( 10 ) , m_a1 ( 11 ) { } virtual void func ( ) { cout << " this is A" << endl ; } int m_a ;

Replace Conditional with Polymorphism (以多态取代条件表达式)

落花浮王杯 提交于 2020-03-02 02:42:33
Summary : 你手上有个条件表达式,它根据对象类型的不同而选择不同的行为。 将这个条件表达式的每个分支放进一个子类内的覆写函数中,然后将原始函数声明为抽象函数。 Motivation: 在面向对象术语中,听上去最高贵的词非“多态”莫属。多态最根本的好处就是:如果你需要根据对象的不同类型而采取不同的行为,多态使你不必编写明显的条件表达式。 正因为有了多态,所以你会发现:“类型码的 switch 语句”以及“基于类型名称的 if-then-else 语句”在面向对象程序中很少出现。 多态能够给你带来很多好处。如果同一组条件表达式在程序许多地点出现,那么使用多态的收益是最大的。使用条件表达式时,如果你想添加一种新类型,就必须查找并更新所有条件表达式。但如果改用多态,只需建立一个新的子类,并在其中提供适当的函数就行了。类的用户不需要了解这个子类,这就大大降低了系统各部分之间的依赖,使系统升级更加容易。 Mechanics: 使用 Replace Conditional with Polymorphism 之前,首先必须由一个继承结构。你可能已经通过先前的重构得到了这一结构。如果还没有,现在就需要建立它。 要建立继承结构,有两种选择: Replace Type Code with Subclasses 和 Replace Type Code with State/Strategy

Python面向对象——多态

邮差的信 提交于 2020-03-02 01:47:18
Python面向对象——多态 目标 多态 面向对象三大特性 1. 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中   定义类的准则 2. 继承 实现代码的重用 ,相同的代码不需要重复的编写   设计类的技巧   子类针对自己特有的需求,编写特定的代码 3. 多态 不同的 子类对象 调用相同的 父类方法 ,产生不同的执行效果    多态 可以 增加代码的灵活度   以 继承 和 重写父类方法 为前提   是调用方法的技巧, 不会影响到类的内部设计 多态案例演练 需求 1.在 Dog 类中封装方法 game   普通狗只是简单地玩耍 2.定义 XiaoTianDog 继承自 Dog,并且重写 game 方法   哮天犬需要在天上玩耍 3.定义 Person 类,并且封装一个 和狗玩 的方法   在方法内部,直接让 狗对象 调用 game 方法 class Dog ( object ) : def __init__ ( self , name ) : self . name = name def game ( self ) : print ( "%s 蹦蹦跳跳的玩耍..." % self . name ) class XiaoTianDog ( Dog ) : def game ( self ) : print ( "%s 飞到天上去玩耍..." % self .

C++复习知识点总结(二)

独自空忆成欢 提交于 2020-03-02 01:15:28
一:C++多态与虚函数 1:基类的指针也可以指向派生类对象 People *p = new People(“王志刚”, 23) p = new Teacher(“赵宏佳”, 45, 8200);//指向派生类对象 调用函数时会出错(people的函数中没有第三项,及8200的数据),即当基类指针 p 指向派生类 Teacher 的对象时,虽然使用了 Teacher 的成员变量,但是却没有使用它的成员函数 基类指针只能访问派生类的成员变量,但是不能访问派生类的成员函数,C++ 增加了虚函数(Virtual Function)。使用虚函数非常简单,只需要在函数声明前面增加 virtual 关键字。即:virtual 类型 函数名 对于派生类比较多,如果不使用多态,那么就需要定义多个指针变量,很容易造成混乱;而有了多态,只需要一个指针变量 p 就可以调用所有派生类的虚函数。 2:虚函数注意事项及条件 虚函数对于多态具有决定性的作用,有虚函数才能构成多态。 只需要在虚函数的声明处加上 virtual 关键字,函数定义处可以加也可以不加。 基类中的函数声明为虚函数,这样所有派生类中具有遮蔽关系的同名函数都将自动成为虚函数 只有派生类的虚函数覆盖基类的虚函数(函数原型相同)才能构成多态(通过基类指针访问派生类函数)。例如基类虚函数的原型为virtual void func();

抽象方法与多态性——小甲鱼C++学习笔记(25)

烂漫一生 提交于 2020-03-01 22:56:16
抽象方法 抽象方法,也可以称为纯虚函数。是面向对象编程技术的另一个核心概念。在设计一个多层次的类继承关系常会用到。 把一个方法说明为一个抽象方法,等于告诉编译器: 这个方法必不可少。但我现在在这个基类里还不能为他提供一个实现。** 抽象方法的语法很简单,在声明一个虚方法的基础上,在原先的末尾上加上“=0”。 (告诉这个编译器不用浪费时间在这个类里寻找这个方法的实现) 总结理解 抽象方法就是在虚方法的后面加上 “=0” 声明为虚方法就是告诉编译器:在分配内存的时候,要根据指针不同的类型来调用正确的方法。 声明为抽象方法就是告诉编译器:在当前这个基类不能实现,去忙别的。 多态性 多态性:是指用一个名字定义不同的函数,调用同一个名字的函数,却执行不同的操作,从而实现传说中的“一个接口,多种方法”。 多态是如何实现绑定的? ----编译时的多态性:通过重载实现。 ----运行时的多态性:通过虚方法实现。 进一步理解析构函数 一般类的析构函数都是释放内存资源,如果析构函数不被调用的话将会造成内存泄漏。 析构器定义为虚方法是为了当一个基类的指针删除一个派生类的对象时,派生类的析构函数可以被正确调用。 代码实现 抽象函数部分: //int *pointer = new int;//声明一个整型指针,并在程序运行时将它指向分配的内存空间 //delect *pointer;//删除指针,释放内存

Java面向对象特征之一 ~~~~多态

て烟熏妆下的殇ゞ 提交于 2020-03-01 21:28:41
1.多态性的理解: 可以理解为一个事物的多种形态。 2.何为多态性: 对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用),举例: Person p = new Man ( ) ; Object obj = new Date ( ) ; 3.多态性的使用:虚拟方法调用 有了对象的多态性以后,我们在编译期, 只能调用父类中声明的方法 ,但在运行期,我们 实际执行的是子类重写父类的方法 。 总结:编译,看左边;运行,看右边。 4.多态性的使用前提: ① 类的继承关系 ② 方法的重写 5.多态性的应用举例: 举例一: public void func ( Animal animal ) { //Animal animal = new Dog(); animal . eat ( ) ; animal . shout ( ) ; } 举例二: public void method ( Object obj ) { } 举例三: class Driver { //具体SQL开发商子类重写了SQL父类的步骤方法 public void doData ( Connection conn ) { //conn = new MySQlConnection(); //conn = new OracleConnection(); //规范的步骤去操作数据 conn . method1 (

面向对象的四大特性

别说谁变了你拦得住时间么 提交于 2020-03-01 19:36:33
封装(Encapsulation) 概念 :封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方式(或者叫函数)来访问内部信息或者数据。 对于封装这个特性,需要编程语言本身提供一定的语法机制来支持。这个语法机制就是访问权限控制。 private、public 等关键字就是 Java 语言中的访问权限控制语法。private 关键字修饰的属性只能类本身访问,可以保护其不被类之外的代码直接访问。public关键字则是完全相反的作用。 封装的意义 对类中属性的访问权限做限制,约束外部对类内部的行为,避免外部错误的修改类中属性。 且,类仅仅通过有限的方法暴露必要的操作,可以提高类的易用性。调用者只需要了解有限的几个方法调用,而不需要了解太多背后的业务细节,用错的概率就会减小很多。 抽象(Abstraction) 概念 :封装主要讲的是如何隐藏信息、保护数据,而抽象讲的是如何隐藏方法的具体实现,让调用者只需要关心方法提供了哪些功能,并不需要知道这些功能是如何实现的。 在面向对象编程中,我们常借助编程语言提供的接口类(比如 Java 中的 interface 关键字语法)或者抽象类(比如 Java 中的 abstract 关键字语法)这两种语法机制,来实现抽象这一特性。 实际上,抽象这个特性是非常容易实现的

Python 【类的多态】

徘徊边缘 提交于 2020-03-01 13:45:48
一.多态 #类的多态 class Animal(object): #Animal类继承object def __init__(self,color): self.color = color def eat(self): print("动物在吃!") def run(self): print("动物在跑") class Cat(Animal): #Cat继承Aninal 继承[属性和方法] def eat(self): #方法重名 print("猫仔!") class Dog(Animal): #继承时候,方法重名用子方法 def __init__(self,name,age,color): super(Dog,self).__init__(color) #super表示父类,调用父类的初始化方法 self.name = name self.age = age def eat(self): #方法重名 print("狗仔!") #多态 def feed(obj): obj.eat() #对象作为参数传入 an = Animal("黄") cat = Cat("橘黄") dog = Dog("小黑",12,"黑色") feed(an) feed(cat) feed(dog) 上面有三种类,Animal类、Cat类、Dog类,三种类中都有共同的方法eat() 使用方法 def feed

JavaBasic:多态

人盡茶涼 提交于 2020-03-01 03:39:00
多态定义 多态是指针对每个类型方法的调用,其真正运行的方法, 取决于实际类型的方法 对某个类型调用每个方法,真正执行的可能是子类覆盖的方法(PS:ovrride标签不是必须的) 利用多态,可以增加多个类型的子类的方法的扩展 object定义的几个重要方法 toString():把instance以字符串输出 equals():判断两个instance逻辑是否相等 hashcode():计算一个instance的哈希值 来源: CSDN 作者: weixin_45215505 链接: https://blog.csdn.net/weixin_45215505/article/details/104576089