多态

多态和反射

匿名 (未验证) 提交于 2019-12-02 23:49:02
多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,使用不同的实例而执行不同操作。 多态存在的三个必要条件 继承 重写 父类引用指向子类对象 public class Test { public static void main(String[] args) { show(new Cat()); // 以 Cat 对象调用 show 方法 show(new Dog()); // 以 Dog 对象调用 show 方法 Animal a = new Cat(); // 向上转型 a.eat(); // 调用的是 Cat 的 eat Cat c = (Cat)a; // 向下转型 c.work(); // 调用的是 Cat 的 work } public static void show(Animal a) { a.eat(); // 类型判断 if (a instanceof Cat) { // 猫做的事情 Cat c = (Cat)a; c.work(); } else if (a instanceof Dog) { // 狗做的事情 Dog c = (Dog)a; c.work(); } } } abstract class Animal { abstract void eat(); } class Cat extends Animal { public

【c++基础】c++常见面试问题

匿名 (未验证) 提交于 2019-12-02 23:39:01
1、const 2、static 3、volatile 4、extern 5、new & malloc 6、delete & delete[] 7、strlen & sizeof 8、内存对齐 9、零值比较 10、指针和引用的区别 11、指针与数组 12、指针类型问题 13、智能指针是怎么实现的?什么时候改变引用计数? 构造函数中计数初始化为1; 拷贝构造函数中计数值加1; 赋值运算符中,左边的对象引用计数减一,右边的对象引用计数加一; 析构函数中引用计数减一; 在赋值运算符和析构函数中,如果减一后为0,则调用delete释放对象。 share_prt与weak_ptr的区别? 14、c++多态性和虚函数表 C++多态的实现? 虚函数的作用? 虚函数用于实现多态,这点大家都能答上来但是虚函数在设计上还具有封装和抽象的作用。比如抽象工厂模式。 动态绑定是如何实现的? 静态多态和动态多态。静态多态是指通过模板技术或者函数重载技术实现的多态,其在编译器确定行为。动态多态是指通过虚函数技术实现在运行期动态绑定的技术。 虚函数表 虚函数表是针对类的还是针对对象的?同一个类的两个对象的虚函数表是怎么维护的? 编译器为每一个类维护一个虚函数表,每个对象的首地址保存着该虚函数表的指针,同一个类的不同对象实际上指向同一张虚函数表。 纯虚函数如何定义,为什么对于存在虚函数的类中析构函数要定义成虚函数

TypeScript error TS2345:Argument of type 'String' is not assignable to parameter of type 'string'

匿名 (未验证) 提交于 2019-12-02 23:34:01
今天在学习TypeScript的多态(也就是继承)的时候遇到了一个错误 错误展示 这里提示我们super继承出现了错误.翻译过来就是:string类型的参数不能分配给string类型的参数??? 这是什么鬼 解决错误 看到后面的 String , 心生一计,改成 String 试试?果然可以 改装后的多态代码 仍然存在的疑问 其实前面用 string 继承是没有报错信息展示的,不知道为什么用多态继承的时候就出现了错误,只能先根据提示改成 String ,如果有大佬知道是为什么,请赐教 文章来源: https://blog.csdn.net/qq_40571631/article/details/90317551

c++多态虚指针

匿名 (未验证) 提交于 2019-12-02 23:32:01
虚指针(vptr) 多态实现的条件:有继承、有virtual重写、有父类指针(引用)指向子类对象。 对象中的虚指针什么时候被初始化 对象在创建 的时候,由编译器对 vptr指针进行初始化 只有 当对象的构造完全结束后vptr的指向才最终确定 父类对象的vptr指向父类虚函数表 子类对象的vptr指向子类虚函数表 构造函数不能为虚函数 执行虚函数时,会调用虚指针指向虚函数表中的虚函数 ,而 虚指针是在对象创建时初始化的,而且当对象构造完全结束后vptr才确定 所以此时无法虚指针,因为对象未创建 在构造函数中调用虚函数不能实现多态 因为调用父类构造函数时虚指针指向的是父类的虚函数表 一般情况下基类析构函数需要定义为虚函数 因为 当基类指针指向派生类对象时 , delete时若没有定义虚析构函数会调用父类的析构函数,无法销毁派生部分 ,当定义了虚函数的时候 会调用用虚指针指向虚函数表中的虚函数,会调用派生类析构函数 文章来源: https://blog.csdn.net/weixin_43425693/article/details/89948378

【C++】继承和多态――虚函数和纯虚函数

匿名 (未验证) 提交于 2019-12-02 23:32:01
一、虚函数 虚函数定义: 虚函数指针的优先级最高 虚基类的作用: 虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的。 声明虚基类的一般形式: class 派生类名:virtual 继承方式 基类名 成为虚函数的条件: 虚函数表(编译期间) (一个类) 1、那些函数可以成为虚函数,哪些不能? (不能,因为没有依赖对象调用) (不能,没有依赖对象调用) (不能,因为不能取地址) 3、基类和派生类中的析构函数满足同名覆盖的关系 4、基类指针指向派生类对象(派生类对象中的起始部分)的时候,基类中的析构函数设为虚函数? 避免资源泄漏 5、对象的虚函数指针什么时候指向虚表的? 二、纯虚函数 声明纯虚基类的一般形式: virtual 函数类型 函数名 (参数表列) = 0; 拥有纯虚函数的类为抽象类(抽象类不能生成对象),通过引用或者指针来实现 class Person { virtual void display() //虚函数 { cout<< <<endl; } virtual void Display () = 0; // 纯虚函数 protected : string _name ; // 姓名 }; class Student : public Person {}; (1)纯虚函数没有函数体; (2)最后面的“=0”并不表示函数返回值为0,它只起形式上的作用

【C++】继承和多态

匿名 (未验证) 提交于 2019-12-02 23:32:01
一、继承 继承是使 代码复用 的一种机制。(本质) 单继承: 一个派生类一个基类派生。 多继承: 一个派生类有两个人或者多个基类。(如:马与驴杂交所生的骡子就有两个基类,骡子既继承了马的一些特征,也继承了驴的一些特征) 派生类 构造派生类包括: 1、从基类接收成员;(派生类接收基类的全部成员,没有选择) 2、调整从基类接收的成员;(可以改变基类成员在派生类中的访问属性(通过继承的方式实现)) 3、在声明派生类时增加的成员(体现派生类对基类功能的扩展) #include<iostream> #include<algorithm> #include<string> #if0 class Base { public: Base(int a) :ma(a){} protected: int ma; }; class Derive:public Base //派生了Derive { public: Derive(int b) :mb(b), Base(b) { } private: int mb; }; int main() { Derive d(10); return 0; } #endif class People { public: typedef int a; public: People(std::string name = "", int age = 0, bool sex =

Java自学-接口与继承 多态

易管家 提交于 2019-12-02 23:00:33
Java的多态 操作符的多态 +可以作为算数运算,也可以作为字符串连接 类的多态 父类引用指向子类对象 示例 1 : 操作符的多态 同一个操作符在不同情境下,具备不同的作用 如果+号两侧都是整型,那么+代表 数字相加 如果+号两侧,任意一个是字符串,那么+代表字符串连接 package charactor; public class Hero { public String name; protected float hp; public static void main(String[] args) { int i = 5; int j = 6; int k = i+j; //如果+号两侧都是整型,那么+代表 数字相加 System.out.println(k); int a = 5; String b = "5"; String c = a+b; //如果+号两侧,任意一个是字符串,那么+代表字符串连接 System.out.println(c); } } 示例 2 : 观察类的多态现象 观察类的多态现象: i1和i2都是Item类型 都调用effect方法 输出不同的结果 多态: 都是同一个类型,调用同一个方法,却能呈现不同的状态 package property; public class Item { String name; int price; public void

python: 多态与虚函数;

匿名 (未验证) 提交于 2019-12-02 22:56:40
通过python的abc模块能够实现虚函数; 例子 : #!/usr/bin/python #coding=utf-8 from abc import ABCMeta, abstractmethod class Base(): __metaclass__=ABCMeta          #必须先声明 def __init__(self): pass @abstractmethod              #虚函数 def get(self): print ‘base get‘ pass class Derivel(Base): def get(self): print "Derivel get" class Derivel2(Base): def get(self): print "Derivel2 get" A = Derivel() B = Derivel2() A.get() B.get() 原文:https://www.cnblogs.com/yinwei-space/p/9275810.html

python0.15-----继承和多态

匿名 (未验证) 提交于 2019-12-02 22:54:36
继承 :有两个类,A类和B类,当我们说A类继承自B类的时候,那么A类就拥有了B类的所有属性和方法。 object类是所有类的父类,还可以成为基类或者超类。 例如:person是object类的子类。person的属性有name,age,eat(),run()。若有100多种类型的人,那么要写100多次name,age,eat(),run()。运用继承的机制。使worker和student继承person。那么worker和student类在创建时,有已经有了name,age,eat(),run()属性和方法。 继承的 优点 : 1.简化了代码,减少冗余。 100多个类不用写其父类的属性和方法。 2.提高了代码的健壮性。 若要修改代码,若用了继承的方式,有些情况只需要修改person类即可,然而若是没有使用继承,那么100多个类全都要进行修改。 3.提高了代码的安全性。 外界并不知道父类的名字,也就不能删除父类的属性和方法。 4.是多态的前提。 缺点 :耦合和内聚是描述类与类之间的关系的。耦合是指类与类之间的联系。例如:person和worker耦合性高,worker和student耦合性低。耦合性越低,内聚性越高代码越好。 单继承的实现: from Person import Person class Student(Person):   def __init__(self

python中的多态

匿名 (未验证) 提交于 2019-12-02 22:51:30
复制代码 ? 1 [ / align][align = left] class MiniOS( object / align][align = left] """MiniOS 操作系统类 """ [ / align][align = def __init__( self / align][align = self .name = / align][align = self .apps = Linux 安装的软件列表为 [] 将 PyCharm [1.0] 的执行程序复制到程序目录... 正在解压缩安装程序... 将 Chrome [2.0] 的执行程序复制到程序目录... 已经安装了 Chrome,无需再次安装 Linux 安装的软件列表为 ['PyCharm', 'Chrome'] 来源:博客园 作者: 爱哭鼻子的小忧伤 链接:https://www.cnblogs.com/heimaguangzhou/p/11635213.html