多态

C++多态

帅比萌擦擦* 提交于 2020-02-07 02:15:42
多态用一句话来总述就是:父类的指针或者引用指向基类的对象 多态分为两种: 编译时多态(静态多态):函数重载,运算符重载 运行时多态(动态多态):派生类,虚函数 静态多态:函数地址早绑定 动态多态:函数地址晚绑定 子类在构造前必须先构造父类,再构造子类,析构顺序相反 non-virtual函数:你不希望子类重写这个函数(override) virtual函数:你希望子类重写这个函数,且你已经有了默认定义 pure-virtual函数:你希望子类一定要重写这个函数,且你对它没有默认定义 ①构造函数可以设置为虚函数吗? 1.从存储空间角度。 虚函数对应一个vtable,这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。 2,从使用角度 构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。 3、从实现上看,vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数 ②虚析构函数 如果子类的成员变量有堆区开辟的空间

c++ -- 多态(类)

↘锁芯ラ 提交于 2020-02-07 02:12:58
假期 2020.02 .06 学习资源来源于中国MOOC以及c语言中文网 前言 c++之所以是面向对象的是因为该语言既支持类也支持多态,而多态是什么呢? 定义 多态就是同一个操作作用于不同的对象会产生不同的结果。这个操作一般指的是函数的调用等等。 标准定义 是对于通过基类指针调用基类和派生类中都有的同名、同参数表的虚函数的语句,编译时并不确定要执行的是基类还是派生类的虚函数;而当程序运行到该语句时,如果基类指针指向的是一个基类对象,则基类的虚函数被调用,如果基类指针指向的是一个派生类对象,则派生类的虚函数被调用。这种机制就叫作“多态(polymorphism)”。 虚函数 :在成员函数前加 virtual 即可生成虚函数。注意虚函数只能在类的内部定义成员函数时使用,不能在类外部写成员函数时使用,构造函数与静态成员都不能是虚函数。 多态类 :包含虚函数的类称为“多态类”。 如何构成多态 常判断条件是 有继承关系 继承关系中有同名的虚函数,并且是覆盖关系 存在基类的指针,指向派生类的虚函数,或者引用 那么什么时候声明虚函数呢? 成员函数所在的类是否是基类 成员函数在继承后是否会被新定义或者更改,是的话,需要;否则,不需要。 多态应用 举一个指针类型的例子: 注意:多态的语句调用哪个类的成员函数是在运行时才能确定的,编译时不能确定。多态的函数调用语句被称为是“动态联编”

C++内存模型

岁酱吖の 提交于 2020-02-06 04:59:34
C++内存模型 一文了解所有C++内存的问题 AlexCool 目录 一 C++内存模型 二 C++对象内存模型 三 C++程序运行内存空间模型 四 C++栈内存空间模型 五 C++堆内存空间模型 六 C++内存问题及常用的解决方法 七 C++程序内存性能测试 环境: uname -a Linux alexfeng 3.19.0-15-generic #15-Ubuntu SMP Thu Apr 16 23:32:37 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux cat /proc/cpuinfo bugs : bogomips : 4800.52 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual cat /proc/meminfo MemTotal: 4041548 kB(4G) MemFree: 216304 kB MemAvailable: 2870340 kB Buffers: 983360 kB Cached: 1184008 kB SwapCached: 54528 kB GNU gdb (Ubuntu 7.9-1ubuntu1) 7.9 g++ (Ubuntu 4.9.2-10ubuntu13) 4.9.2

JAVA的三大特征之一--------------多态

我与影子孤独终老i 提交于 2020-02-06 01:39:29
一:多态的定义: 一个对象有多种形态 就称为多态 package 面向对象.多态.A; class Animal { void eat() { System.out.println("动物吃东西!"); } } class Dog extends Animal{ void eat() { System.out.println("狗吃骨头!"); } } class Cat extends Animal{ void eat() { System.out.print("猫吃鱼!"); } } public class Test { public static void main(String[] args) { //狗是动物类 //一个对象有多种形态 就称为多态 //一个表示自己的类,一个表示自己父类的类型 //子类对象赋值给父类类型 //运行时,表现得是子类的特征(先去找子类) //Animal dog = new Dog(); Dog dog = new Dog(); dog.eat(); //Animal cat = new Cat(); Cat cat= new Cat(); cat.eat(); System.out.println(cat.getClass()); /*** * 子类对象赋值给父类类型 * 运行时,表现的是子类的特征(先去找子类) */ } } 二

Java基础知识

孤街醉人 提交于 2020-02-05 23:04:07
1. 面向对象三大特性:封装,继承,多态 封装 概念:把类的某些信息私有化隐藏起来,外部不能直接访问,而是通过该类提供的方法来实现对这些隐藏信息的访问和操作。 好处: 只能通过规定的方法来访问私有数据 隐藏类的内部实例细节,方便修改和实现。 继承 在已有类的基础上添加新的数据或方法。“is-a” 关系是继承的一个明显特征。 子类拥有父类所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类无法访问, 只是拥有 。(好处:实现了代码复用) 子类可以拥有自己的属性和方法,即对父类进行扩展。 子类可以用自己的方式实现父类的方法( 重写 ) 多态 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。 在Java中有两种形式可以实现多态: 继承(多个子类对同一方法的重写) 接口(实现接口并覆盖接口中同一方法) 一个三大特性讲解得很详细的博客: JAVA面向对象三大特性详解 2. Java 和C++的区别 (相同点)都是面向对象的语言,都支持封装、继承和多态 Java不提供指针来直接访问内存,程序内存更加安全。C++中有指针,但Java中有引用 Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,都是接口可以多继承 Java有自动内存管理机制,不需要程序员手动释放无用内存

C++ 多态与虚函数

我是研究僧i 提交于 2020-02-05 10:38:56
这一篇介绍一下 C++ 面向对象三大特征之一的多态(之前面试某大厂的实习生被问到多态,后来又了解到一些设计模式,才体会到多态的强大,在这里把对多态的一点点浅显认识总结一下) 如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢 多态 父类的一个指针,可以有多种执行状态(父类的指针调用子类的函数),即多态 多态实际上只是一种思想,而虚函数是实现这个思想的语法基础 虚函数 虚表 若对象有虚函数,对象空间最开始 4Byte(32Bit目标平台)或 8Byte(64bit目标平台)内容是虚表(虚函数列表)的首地址,叫虚指针 在实例化对象时,编译器检测到虚函数(virtual修饰的成员函数)时,会将虚函数的地址放到虚表(类似于一个存放函数指针的数组)中 当实例化子类时,检测到有虚函数的重写,编译器会用子类重写的虚函数地址覆盖掉之前父类的虚函数地址,当调用虚函数时,检测到函数是虚函数就会从虚表中找对应的位置调用,若子类没有重写,虚表中的虚函数地址就还是父类的,若子类中有重写,虚表记录的就是子类重写的虚函数地址,即实现了父类的指针调用子类的函数 虚表中先记录父类中的虚函数地址,接着记录子类中虚函数地址(若子类重写父类的虚函数则是覆盖) 最后虚表还有一个尾值是 0 class Test { public : virtual void vfunc ( ) { cout << "Test virtual

C++多态的实现

冷暖自知 提交于 2020-02-05 06:34:10
文章目录 C++如何实现多态? 简单的回答 C++虚指针与vtbl 参考 C++如何实现多态? 简单的回答 通过动态绑定实现的 而动态绑定的话,又是通过vptr(指向虚表的指针)、vtbl(虚表)。 C++虚指针与vtbl https://www.cnblogs.com/fenglongyu/p/7385056.html 参考 https://blog.csdn.net/zyq0335/article/details/7657465 来源: CSDN 作者: 代码人老周 链接: https://blog.csdn.net/qq_16761099/article/details/102979533

多态

匆匆过客 提交于 2020-02-05 06:32:01
#include <iostream> using namespace std; class A { protected: int a; public: A() :a(1111) {} virtual void Show() { std::cout << a << std::endl; } void ShowInfo() { std::cout <<"A" << std::endl; } }; class B:public A { private: int b; public: B() :b(2222) {} virtual void Show(){std::cout << b << std::endl;} void ShowInfo() { std::cout << "B" << std::endl; } void ShowInfoB() { std::cout << "Class B" << std::endl; } }; class C :public B { private: int c; public: C() :c(3333) {} virtual void Show(){std::cout << c << std::endl;} void ShowInfo() { std::cout << "C" << std::endl; } void ShowInfoC() {

Java多态性理解

好久不见. 提交于 2020-02-05 06:13:12
【转】Java多态性理解 Java中多态性的实现 什么是多态 面向对象的三大特性 :封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。 多态的定义 : 指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用) 实现多态的技术称为 :动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。 多态的作用 : 消除类型之间的耦合关系 。 现实中,关于多态的例子不胜枚举 。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。 下面是多态存在的三个必要条件,要求大家做梦时都能背出来! 多态存在的三个必要条件 一、要有继承; 二、要有重写; 三、父类引用指向子类对象 。 多态的好处 : 1. 可替换性(substitutability)。 多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。 2. 可扩充性(extensibility)。

面向对象编程—继承和多态!!!

北战南征 提交于 2020-02-05 03:38:54
面向对象编程——继承和多态 //—引用小峯的讲义(码农小峯) 1、为什么使用继承 从已有的类派生出新的类,称为继承。 在不同的类中也可能会有共同的特征和动作,可以把这些共同的特征和动作放在一个类中,让其它类共享。 因此可以定义一个通用类,然后将其扩展为其它多个特定类,这些特定类继承通用类中的特征和动作。 继承是 Java 中实现软件重用的重要手段,避免重复,易于维护,易于理解。 2、父类和子类 如果类 B 从类 A 派生,或者说类 B 扩展自类 A,或者说类 B 继承类 A, 则称类 A 为"父类",也称为超类、基类; 称类 B 为"子类",也称为次类、扩展类、派生类。 子类从它的父类中继承可访问的数据域和方法,也可以添加新的数据域和新的方法。 定义继承的语法: 修饰符 class 子类名 extends 父类名 例如:Shape 类是父类,其子类可以有 Circle 类、Rectangle 类、Triangle 类,等等。 继承的注意点: 子类不是父类的子集,子类一般比父类包含更多的数据域和方法。 父类中的 private 数据域在子类中是不可见的,因此在子类中不能直接使用它们。 继承是为"是一个"的关系建模的,父类和其子类间必须存在"是一个"的关系,否则不能用继承。 但也并不是所有"是一个"的关系都应该用继承。例如,正方形是一个矩形,但不能让 Square 类来继承