多态

对象模型

眉间皱痕 提交于 2019-12-02 12:29:36
对象模型 ​ 当一个类本身定义了虚函数,或其父类有虚函数时,为了支持多态机制,编译器将为该类添加一个虚函数指针(vptr)。虚函数指针一般都放在对象内存布局的第一个位置上,这是为了保证在多层继承或多重继承的情况下能以最高效率取到虚函数表。当vprt位于对象内存最前面时,对象的地址即为虚函数指针地址。发生动态绑定时,编译器根据虚指针找到相应的虚函数来执行。 ​ 非静态数据成员被配置在每一个类对象之内,静态数据成员、静态和非静态函数被放在类对象之外。虚函数则由下面两个步骤支持: 每个类产生出一堆指向虚函数的指针,放在虚表vptl中。 每个类对象被安插一个虚指针vptr,指向相关的虚表vptl。vptr的设置与重置有每一个类的构造函数、析构函数和拷贝复制运算符自动完成。 来源: https://www.cnblogs.com/vlyf/p/11745382.html

多态(第五次作业)

走远了吗. 提交于 2019-12-02 12:26:03
多态: 按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。 C++ 多态意味着 调用成员函数 时,会根据调用函数的对象的类型来 执行不同的函数。 有例子如下: #include<iostream> using namespace std; class Shape { protected: int width,height; public: Shape(int a = 0,int b = 0) { width = a; height = b; } int area() { cout << "Parent class area : " << endl; return 0; } }; class Rectangle : public Shape { public: Rectangle(int a = 0,int b = 0):Shape(a,b){} int area() { cout << "Rectangle class area : " << endl; return (width*height); } }; class Triangle: public Shape { public: Triangle(int a = 0,int b = 0):Shape(a,b){} int area() { cout << "Triangle class

go继承

与世无争的帅哥 提交于 2019-12-02 12:18:13
go中没有继承,只能通过组合来实现继承。 继承和组合区别 继承就是子类继承了父类的特征和行为,使得子类实例具有父类的行为和方法,属于is-a的范畴。 组合就是通过对现有对象的拼装从而获得实现更为复杂的行为的方法。 一个struct嵌套了另外一个匿名的struct从而实现了继承,嵌套多个匿名struct实现多重继承。 一个struct嵌套了宁外一个struct的实例实现了组合。 type Animal struct { } //继承 type Cat struct { //匿名 *Animail } //组合 type Dog struct { animal Animal } 继承的简单实现 type Animal struct { name string } type MachineCat struct { *Animal } //定义一个receive为IAnimal的函数 func (value *Animal) GetName() { fmt.Printf("Animal: %v\n", value.name) } func main() { //实例化machineCat machineCat := &MachineCat{ &Animal{ "test", }, } machineCat.GetName() } 输出内容 Animal: test 声明一个struct

C++多态

老子叫甜甜 提交于 2019-12-02 11:58:32
**C++的多态性用一句话概括就是**:在基类的函数前加上virtual关键字,<font color="red">在派生类中重写该函数</font>,运行时将会<font color="red">根据对象的实际类型来调用</font>相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数 1:用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。 2:存在虚函数的类都有一个一维的虚函数表叫做虚表,类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。 3:多态性是一个接口多种实现,是面向对象的核心,分为类的多态性和函数的多态性。 4:多态用虚函数来实现,结合动态绑定. 5:纯虚函数是虚函数再加上 = 0; 6:抽象类是指包括至少一个纯虚函数的类。 纯虚函数:virtual void fun()=0;**即抽象类!必须在子类实现这个函数,即先有名称,没有内容,在派生类实现内容。** 我们先看个例子 ``` #include "stdafx.h" #include <iostream> #include <stdlib.h> using namespace std; class Father { public: void Face() { cout << "Father's face" << endl; }

多态知识点

99封情书 提交于 2019-12-02 11:57:47
多态知识点 一、什么是多态 ​ 多态性(polymorphism)据说最早源自希腊语,从字面上理解就是多种形态,多种形式。具体到C++这种面向对象(OOP)的语言中,其实就是“一种接口,多种实现(方法)”。 ​ 多态可分为 静态多态 和 动态多态 ,静态多态和动态多态的区别其实只是在什么时候将函数实现和函数调用关联起来,是在编译时期还是运行时期,即函数地址是早绑定还是晚绑定的? 二、静态多态 静态多态是指在编译期间就可以确定函数的调用地址,并生产代码,这就是静态的,也就是说地址是早早绑定的,静态多态也往往被叫做静态联编。 例一:复数类的加减(成员函数) include "pch.h" include using namespace std; class Complex { public: Complex (double r = 0.0, double i = 0.0) :real(r), imag(i) {} Complex operator+ (const Complex &c2) const; Complex operator- (const Complex &c2) const; void display() const; private: double real; double imag; }; Complex Complex::operator+(const

C++第五次作业

隐身守侯 提交于 2019-12-02 11:55:21
重载与多态 多态: 一、概念:指同样的消息被不同类型的对象接收时导致的不同行为。消息是指对类的成员函数的调用,不同的行为指不同的实现,也是调用了不同的函数。 二、类型: 重载多态、强制多态 (专用多态) 、 包含多态、参数多态 (通用多态) 。 三、多态的实现: 1、编译时的多态是在编译过程中确定了同名操作的具体对象。 2、运行时的多态是在程序运行过程中才动态地确定操作所针对的具体对象。 运算符重载: 是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同行为。 实质就是函数重载!!! 一、运算符的重载形式: 1、重载为类的非静态成员函数。 2、重载为非成员函数。 二、语法形式: 返回类型 operator 运算符(形参表) { 函数体 } 例:通过运算符重载实现复数类加减法。 #include<iostream> using namespace std; class Complex { public: Complex(double r = 0.0, double i = 0.0) :real(r), imag(i) {} Complex operator+(const Complex& c2)const; Complex operator-(const Complex& c2)const; void display()const; private:

C++第五次作业

不羁的心 提交于 2019-12-02 11:48:30
多态性 一、运算符重载 运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同的行为。 1、运算符重载的规则 (1)C++种的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已经有的运算符。 (2)重载之后的运算符的优先级和结核性都不会改变。 (3)运算符重载时针对新类型数据的实际需要,对原有运算符进行适当的改造。一般来讲,重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。 C++标准规定,有些操作符是不能重载的,它们是类属关系运算符"."、成员指针运算符".*"、作用域分辨符"::"和三目运算符"?:"。 前面两个运算符保证了C++中访问成员功能的含义不被改变。作用域分辨符的操作是类型,而不是普通的表达式,也不具备重载的特征。 运算符的重载形式: 返回类型 operator 运算符(形参表) {   函数体 } 重载为类的成员函数和重载为非成员函数的声明方式不同。 2、运算符重载的实例 对类Point重载“++”(自增)、“--”(自减)“、运算符,要求同时重载前缀和后缀的形式 #include <iostream> using namespace std; class Point { public: Point(int xx = 0, int yy = 0):x(xx),y(yy){}

C++ 第五次作业 重载与多态

安稳与你 提交于 2019-12-02 11:44:25
重载与多态 一、教学目标 熟练了解并掌握重载和多态的相关概念,进而在平时应用到,并且能了解其中的思想和过程 二、教学过程 (一)定义 多态是指同样的消息被不同类型的对象接收时导致的不同的行为,消息是指对类的成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。。 C++支持的多态有多种类型,重载(包括函数重载和运算符重载)和虚函数是其中 主要的方式。 (二)多态的类型 面向对象的多态性可以分为4类:重载多态,强制多态,包含多态和参数多态,前面两种称为专用多态,后面两种称为通用多态。 (三)多态的实现 分为两类:编译时的多态和运行时的多态。 (四)具体应用: 1.运算符重载: 运算符重载就是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同的行为。 运算符重载的本质就是函数重载。 注:运算符重载为类型的成员函数时,函数的参数个数比原来的操作个数要少一个;(后置++;- -除外) 重载为非成员函数时,个数相同。 举例:定义计数器 Counter 类,对其重载运算符 + typedef unsigned short USHORT; #include <iostream.h> class Counter { public: Counter(); Counter(USHORT initialValue); Counter(){} USHORT

1021课堂内容

北慕城南 提交于 2019-12-02 11:39:06
一,继承 动手实验_1: 题目:运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第一句,影响重大! TestInherits.java: class Grandparent { public Grandparent(){ System.out.println("GrandParent Created."); } public Grandparent(String string) { System.out.println("GrandParent Created.String:" + string); } } class Parent2 extends Grandparent{ public Parent2(){ super("Hello.Grandparent."); System.out.println("Parent Created"); // super("Hello.Grandparent."); } } class Child2 extends Parent2 { public Child2() { System.out.println("Child Created"); } } public class

封装继承多态

大憨熊 提交于 2019-12-02 11:37:09
面向对象语言有三大法宝:封装、继承和多态。其功能就一条,加快程序开发,方便理解。 封装 :在面向对象编程中,封装(encapsulation)是将对象运行所需的资源封装在程序对象中——基本上,是方法和数据。意思就是说,把该单独拿出来的方法或者属性单独新建个类。,把他们放到一起。 例如说: namespace IArraylIst { class Score { ArrayList a1 = new ArrayList(); /// <summary> /// 添加分数的方法 /// </summary> public void AddMark() { int i = 0; while(true) { Console.WriteLine("输入评分,以-1结束"); i = int.Parse(Console.ReadLine()); if(-1 != i) { a1.Add(i); } else { break; } } } /// <summary> /// 删除最大最小分数 /// </summary> public void Del() { if(a1.Count > 2) { a1.Sort(); a1.RemoveAt(0); a1.RemoveAt(a1.Count - 1); } } /// <summary> /// 求平均分 /// </summary> ///