派生类

C++多态小结

眉间皱痕 提交于 2019-12-02 12:34:52
C++ 多态 多态 多态 按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。 C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 多态与非多态的实质区别就是函数地址是早绑定还是晚绑定 。如果函数的调用,在编译器编译期间就可以确定函数的调用地址,并生产代码,是静态的,就是说地址是早绑定的。而如果函数调用的地址不能在编译器期间确定,需要在运行时才确定,这就属于晚绑定。 下面的实例中,基类 Shape 被派生为两个类,如下所示: #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

C++第五次作业

你。 提交于 2019-12-02 11:32:20
虚函数 虚函数是面向对象编程函数的一种特定形态,是C++用于实现多态的一种有效机制。 1、什么是虚函数? 指向基类的指针在操作它的多态类对象时,会根据不同的类对象调用其相应的函数,这个函数就是虚函数,虚函数用virtual修饰函数名。虚函数的作用是在程序的运行阶段动态地选择合适的成员函数。在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型,(参数类型的顺序也要一致),以实现统一的接口。如果在派生类中没有重新定义虚函数,则它继承基类的虚函数。 使用虚函数时需要注意一下几个方面: (1)只需在声明函数的类体中使用关键字virtual将函数声明为虚函数,在定义函数时不需要 (2)将基类中某一成员函数声明为虚函数后,派生类中的同名函数自动成为虚函数 (3)如果类(基类和派生类)中声明了某成员函数为虚函数,则类中不能再出现与之相同的非虚函数 (4)非类的成员函数不能定义为虚函数,全局函数以及类的静态成员函数(因为调用类的静态成员函数不需要实例,但调用虚函数需要一个实例)和构造函数(因为构造函数是在对象完全构造之前运行的,构造函数是初始化虚表指针,而当要调用虚函数时需要知道虚表指针,存在矛盾,但构造函数里是可以调用虚函数的)、内联函数也不能定义为虚函数,但一般将析构函数定义为虚函数(如果不把析构函数定义为虚函数,当用基类指针delete时,无法调用派生类的析构函数

虚函数以及纯虚函数

天涯浪子 提交于 2019-12-02 11:27:30
   多态性 是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异,而采用不同的策略。   虚函数和纯虚函数都是实现多态的重要方法。本文就这两种方法进行分析以及比较 1、虚函数 在基类中声明为 virtual 并在一个或者多个派生类被重新定义的成员函数 语法规则: virtual 函数返回类型 函数名(参数表) {函数体} 语法分析:虚函数的声明和定义和普通的成员函数一样,只是在返回值之前加入了关键字virtual。      在基类当中定义了虚函数,可以再子类中定义和基类中相同函数名、相同参数、相同返回值和不同实现体的虚函数      定义为虚函数是为了让 基类函数的指针或者引用来指向子类。 #include<iostream> using namespace std; class A { public: void fun() { cout << "A::fun()..." << endl; } }; class B :public A { public: void fun() { cout << "B::fun()...." << endl; } }; int main() { A *a = new A; //A类指针指向A类对象 a->fun(); A *b = new B; //A类指针指向B类 对象 b->fun(); delete a;

多态(C++语言)

倾然丶 夕夏残阳落幕 提交于 2019-12-02 11:24:37
一、多态的定义 派生类对象的地址可以赋值给基类指针。对于通过基类指针调用基类和派生类中都有的同名、同参数表的虚函数的语句,编译时并不确定要执行的是基类还是派生类的虚函数;而当程序运行到该语句时,如果基类指针指向的是一个基类对象,则基类的虚函数被调用,如果基类指针指向的是一个派生类对象,则派生类的虚函数被调用。这种机制就叫作“多态(polymorphism)”。多态可以简单地理解为同一条函数调用语句能调用不同的函数;或者说,对不同对象发送同一消息,使得不同对象有各自不同的行为。 所谓“虚函数”,就是在声明时前面加了 virtual 关键字的成员函数。virtual 关键字只在类定义中的成员函数声明处使用,不能在类外部写成员函数体时使用。静态成员函数不能是虚函数。包含虚函数的类称为“多态类”。 *例如以下程序: #include <iostream> using namespace std; class A { public: virtual void Print() { cout << "A::Print" << endl; } }; class B : public A { public: virtual void Print() { cout << "B::Print" << endl; } }; class D : public A { public: virtual void

c++纯虚函数与抽象基类

一曲冷凌霜 提交于 2019-12-02 11:22:06
首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数。 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。 定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。 1、简介 假设我们有下面的类层次: class A { public : virtual void foo ( ) { cout << "A::foo() is called" << endl ; } } ; class B : public A { public : void foo ( ) { cout << "B::foo() is called" << endl ; } } ; int main ( void ) { A * a = new B ( ) ; a - > foo ( ) ; // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的! return 0 ; } 这个例子是虚函数的一个典型应用,通过这个例子,也许你就对虚函数有了一些概念。它虚就虚在所谓"推迟联编"或者"动态联编"上,一个类函数的调用并不是在编译时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类的函数还是哪个派生类的函数,所以被成为"虚"函数。

类的继承和派生(自我总结)

南笙酒味 提交于 2019-12-02 06:48:05
在派生类中: 无论是哪种继承都 不可以直接访问 上一级类继承下来私有成员 不可以直接访问 public protected 对于protect和public则根据继承方式的不同而不同, 继承方式的不同限制的是派生类对象对基类的访问 。 在派生类内部中: 无同名函数 可以访问除开基类私有成员的任何成员 有同名函数(同名就行) 派生类中的同名函数隐藏基类中的同名函数 可以通过类名::函数进行区分 可能会引发二异性(继承来的函数同名[同一等级]) protected继承与private继承的差别: protected不会继承到没有 —— private会继承到不能访问 只继承一次是看不出来差距的 类型转换 公有派生类对象(public方式) 可以被当作基类的对象使用,反之则不可以. 公有派生使得基类的对外访问接口是不变的 派生类的对象可以隐含转换为基类对象; 派生类对象可以初始化基类的引用 派生类的指针可以隐含转换为基类的指针 通过基类对象名、指针只能使用从基类继承的成员 不要重新定义继承而来的非虚函数 ,使得同名函数被覆盖掉,使用虚函数更加满足多态需求 派生类不能继承的基类成员 缺省构造函数,拷贝构造函数,拷贝赋值函数,以及析构函数这四种成员函数被称作特殊的成员函数 构造函数 未继承基类构造函数,那么使用派生类构造函数进行统一初始化 C++11规定: 可用using

C# -- Abstract和Virtual学习

雨燕双飞 提交于 2019-12-02 02:32:15
一、Virtual方法(虚方法) 1:virtual 关键字用于在基类(父类)中修饰方法。virtual的使用会有两种情况: (1):在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法,比如在一个Book类中有一个虚方法InitDate(),然后一个Fiction类继承了Book类,但是在该类中并没有实现InitDate()这个方法,那么实例Fiction类使用方法的还是Book类中的虚方法 (2):在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。 二、Abstract方法(抽象方法) 1: abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。抽象方法的实现必须在派生类中使用override关键字来实现。 2:接口和抽象类最本质的区别:抽象类是一个不完全的类,是对对象的抽象,而接口是一种行为规范。 3: C# 是面向对象的程序设计语言,每一个函数都属于一个类。 4:Static:当一个方法被声明为Static时,这个方法是一个静态方法,编译器会在编译时保留这个方法的实现。也就是说,这个方法属于类,但是不属于任何成员,不管这个类的实例是否存在,它们都会存在。就像入口函数Static void Main

c++语法笔记(下)

我的梦境 提交于 2019-12-01 17:21:25
多态性与虚函数 多态性 (函数重载,运算符重载就是多态性现象) 多态性 :向不同对象发送同一个消息,不同对象在接收时会产生不同的行为。(每个对象用自己的方式去响应共同的消息) 多态性又可以分为静态多态性和动态多态性 静态多态性 在编译时编译系统就可以判定调用哪个重载运算符(函数)。 #include<iostream> using namespace std; class point { public: point(float a, float b) { //构造函数 x = a; y = b; } friend ostream & operator <<(ostream &, point &); //运算符重载 protected: float x, y; }; std::ostream &operator<<(std::ostream &output, point &p) { //运算符重载的定义 output << "(" << p.x << "," << p.y << ")" << endl; return output; } class circle :public point { public: circle(float a, float b, float c) :point(a, b), radius(c) {} //构造函数 friend ostream

C++继承和多态

你说的曾经没有我的故事 提交于 2019-12-01 08:44:42
C++继承和多态 继承和派生 C++ 中的继承是类与类之间的关系, 继承(Inheritance) 可以理解为一个类从另一个类获取成员变量和成员函数的过程。 派生(Derive) 和继承是一个概念, 被继承的类称为父类或基类,继承的类称为子类或派生类。“子类”和“父类”通常放在一起称呼,“基类”和“派生类”通常放在一起称呼 当你创建的新类与现有的类相似 当你需要创建多个类,它们拥有很多相似的成员变量或成员函数时,使用继承。可以将这些类的共同成员提取出来,定义为基类,然后从基类继承 class Student: public People 继承的一般语法为: class 派生类名:[继承方式] 基类名{ 派生类新增加的成员 }; 继承方式: 包括 public(公有的)、private(私有的)和 protected(受保护的),此项是可选的,如果不写,那么默认为 private。 C++三种继承方式 继承方式 限定了基类成员在派生类中的访问权限,包括 public(公有的)、private(私有的)和 protected(受保护的)。此项是可选项,如果不写,默认为 private(成员变量和成员函数默认也是 private) public、protected、private 指定继承方式 1) public继承方式 基类中所有 public 成员在派生类中为 public 属性;

C++继承与派生

我是研究僧i 提交于 2019-12-01 07:28:28
c++继承与派生 课题目标 学习声明和使用类的继承关系,声明派生类。 熟悉不同继承方式下对基类成员的访问控制。 课题引入 如何让一个类能直接调用另一个类的数据和函数。 我们常用类的友元来实现,但是友元关系并不能继承。基类的友元对派生类的成员没有特殊访问权限。 如果基类被授予友元关系,则只有基类具有特殊访问权限,该基类的派生类不能访问授予友元关系的类。 概念引入: 继承 :保持已有类的特性而构成新类的过程。 派生 :在已有类的基础上新增自己的特性而产生新类的过程。 基类被继承的已有类(父类) 派生类派生出的新类称为(子类) class 派生类名:继承方式 基类名{ 成员声明; } 继承方式种类 : 1.公有继承(public ) 公有继承,基类的公有成员和保护成员在派生类中属性不变,但私有成员不可直接访问。也就是说通过派生类对象只能访问基类的public成员。 #include<iostream> using namespace std; class point{ private: int x, y; public: void initpoint(float x1 = 0, float y1 = 0) { x = x1; y = y1; } void move(float xx=0, float yy=0) { x += xx; y += yy; } float getx()