11-多态与继承(上)

一.函数重写

    *: 在子类中定义与父类中原型相同的函数

    *: 函数重写只发生在父类与子类之间

class Parent
{
public:
	void print()
	{
		cout<<"parent"<<endl;
	}
};
class Child:public Parent
{
public:
	void print()
	{
		cout<<"child"<<endl;
	}
};

      说明: print() 就为重写函数

       *: 父类中被重写的函数依然会继承给子类

       *: 默认情况下子类重写的函数将隐藏父类中的函数

       *:通过作用域分辨符::可以访问到父类中被隐藏的函数

	child.print();
	child.Parent::print();

当函数重写遇上赋值兼容性原则

void run()
{
	Child child;

	Parent* pp = &child;
	Parent& rp =child;

	child.print();
	pp->print();
	rp.print();
}

问题所在:

(1) C++与C相同,是静态编译型语言

       (2) 在编译时,编译器自动根据指针的类型判断指向的是一个什么样的对象

       (3) 所以编译器认为父类指针指向的是父类对象

       (4) 由于程序没有运行,所以不可能知道父类指针指向的具体是父类对象还是子类对象

       (5) 从程序安全的角度,编译器假设父类指针只指向父类对象,因此编译的结果为调用父类的成员函数。                            

void func(Parent* p)
{
	p->print();
}

   分析: 在编译这个函数的时候,编译器不可能知道指针P指向什么,但是没有理由报错,于是编译器认为

最安全的做法是编译到父类的print函数。

二. 多态的本质

   
 根据实际的对象类型决定函数调用语句的具体调用目标

*: 如果父类指针指向的是父类对象,则调用父类中定义的函数

        *: 如果父类指针指向的是子类对象,则调用子类中定义的重写函数

      多态: 同样的调用语句有多种不同的表现形态

     

       C++中的多态支持

           *:  C++中通过 virtual 关键字对多态进行支持

           *:  使用virtual声明的函数被重写后即可表现出多态性

父类函数中加入virtual

class Parent
{
public:

	virtual void print()
	{
		cout<<"parent"<<endl;
	}
};

小结:

(1) 函数重写只可能发生在父类与子类之间

       (2) virtual 关键字是C++中支持多态的唯一方式

       (3) 被重写的虚函数即可表现出多态性

          

时间: 2024-10-01 07:41:56

11-多态与继承(上)的相关文章

多态公有继承

多态公有继承:所谓多态公有继承,就是同一个方法在派生类和基类中的行为不同. 实现多态公有继承的机制:1,在派生类重新定义基类的方法.(用于对象)2,使用虚方法(多用于指针和引用),虚方法在基类用关键字virtual声明,在派生类中会自动识别基类中声明的虚方法.所以,在派生类中可以用(也可以不用)virtual显式标出哪个方法是虚方法.通俗来讲:为了实现一种方法可以在派生类和基类中的行为不同,于是在派生类中重新定义基类函数的方法(比如基类有方法A, 但又在派生类中重新定义了方法A, 它们名字一样,

七:Java之封装、抽象、多态和继承

本文章介绍了关于Java中的面向对象封装.抽象.继承.多态特点 Java面向对象主要有四大特性:封装.抽象.继承和多态. 一.封装 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成"类",其中数据和函数都是类的成员. 在面向对象语言中,封装特性是由类来体现的,我们将现实生活中的一类实体定义成类,其中包括属性和行为(在Java中就是方法),就好像人类,可以具有name,sex,age等属性,同时也具有eat(),sle

C++11中的继承构造函数

时间:2014.06.19 地点:基地 ------------------------------------------------------------------------- 一.问题描述 在继承体系中,如果派生类想要使用基类的构造函数,需要在构造函数中显式声明.如下: struct A { A(int i){} }: struct B:A { B(int i):A(i){} }; 在这里,B派生于A,B 又在构造函数中调用A的构造函数,从而完成构造函数的传递. 又比如如下,当B中存

深入浅出OOP(三): 多态和继承(动态绑定/运行时多态)

在前面的文章中,我们介绍了编译期多态.params关键字.实例化.base关键字等.本节我们来关注另外一种多态:运行时多态, 运行时多态也叫迟绑定. 运行时多态或迟绑定.动态绑定 在C#语音中,运行时多态也叫方法重写(overriding),我们可以在子类中overriding基类的同签名函数,使用"virtual & override"关键字即可. C#的New.Override关键字 创建一个console 示例工程,命名为InheritanceAndPolymorphis

.NET Core CSharp初级篇 1-6 类的多态与继承

.NET Core CSharp初级篇 1-6 本节内容为类的多态与继承 简介 终于讲到了面向对象三大特性中的两大特性--继承与多态.通过继承与多态,我们能很好的将类的拓展性发挥到了极致.在下面的内容讲解中,我们将从各个方面对继承和多态进行刨析. 继承 继承事实上是一个非常好理解的语法,在C#中实现继承使用A:B,表示A类继承B类.子类(一称为派生类)继承于父类(一称为基类)就好比孩子继承了父亲的一切,但是孩子总归是有自己的个性的,而父亲也有一些不会告诉孩子的事情.如果我们从之前的访问控制符这一

ios网络学习------11 原生API文件上传之断点续传思路

#import "MainViewController.h" @interface MainViewController () @end @implementation MainViewController - (void)viewDidLoad { [super viewDidLoad]; //下载文件 [self download]; } -(void)download { //1. NSURL NSURL *url = [NSURL URLWithString:@"ht

head first c&lt;11&gt;初探网络编程上

服务器连接网络四部曲. 为了与外界沟通,c程序用数据流读写字节,比较常用的数据流有标准输入.标准输出.文件等. 如果想写一个与网络通信的程序,就需要一种新的数据流----------套接字. 使用套接字与客户端程序通信前,服务器需要历经四个阶段:绑定.监听.接受.开始. 1.绑定端口 计算机可能同时运行多个服务器程序,为了放置不同的对话混淆,每项服务必须使用不同的端口(port).端口就好像电视频道, 用不同的频道接受不同的节目. 服务器在启动时,需要告诉操作系统将要使用哪个端口,这个过程叫端口

深入浅出OOP(四): 多态和继承(抽象类)

在本文中,我们讨论OOP中的热点之一:抽象类.抽象类在各个编程语言中概念是一致的,但是C#稍微有些不一样.本文中我们会通过代码来实现抽象类,并一一进行解析. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时多态) 深入理解OOP(四):多态和继承(C#中的抽象类) 深入理解OOP(五):C#中的访问修饰符(Public/Private/Protected/Internal/Sealed/Cons

深入理解OOP(二):多态和继承(继承)

本文是深入浅出OOP第二篇,主要说说继承的话题. 深入理解OOP(一):多态和继承(初期绑定和编译时多态) 深入理解OOP(二):多态和继承(继承) 深入理解OOP(三):多态和继承(动态绑定和运行时多态) 深入理解OOP(四):多态和继承(C#中的抽象类) 深入理解OOP(五):C#中的访问修饰符(Public/Private/Protected/Internal/Sealed/Constants/Static and Readonly Fields) 深入理解OOP(六):枚举(实用方法)

20.10 for循环;20.11 while循环(上);20.12 while循环(下);20.13 break跳出循环;20.14 ;20.15

20.10 for循环 案例1 1. 编写for循环脚本:计算1到100所有数字和: [[email protected] ~]# vi for1.sh 添加内容: #!/bin/bash sum=0 for i in `seq 1 100` do echo "$sum + $i" sum=$[$sum+$i] echo $sum done echo $sum 2. 执行for1.sh脚本: [[email protected] ~]# sh for1.sh 案例2 1. 文件列表循环