【C++】六、继承与多态

重庆大学c++期末复习真题 期末模拟选择题答案:CACBBCDCCA分数 4作者 刘骥单位 重庆大学下列程序代码,正确的输出结果是( )int a=0xfe;char b=062;A.0xfe,062B.fe,62C.254,2D.254,622-2分数 4作者 刘骥单位 重庆大学下列代码能正确执行的是( )A.char a=‘C’;p=&a;p=a;D. 阅读详情


1.继承

对于继承的基础知识点参考:c++继承,下面就不过多阐述。没有记录的必要性

1.1 定义

1.2 基类派生类

1.3 访问控制和继承的方式

1.4 继承中构造与析构调用原则

构造;先构造父类,再构造成员变量,最后构造自己
析构:先析构自己,再构造成员变量,最后析构父类

构造即生成,析构即释放,释放是按生成的相反顺序!

1.5 继承中同名成员变量处理

  1. 当子类成员变量与父类成员变量同名时
  2. 子类依然从父类继承同名成员
  3. 在子类中通过作用域分辨符::进行同名成员区分(在派生类中使用基类的同名成员,显式地使用类名限定符)
  4. 同名成员存储在内存中的不同位置
#include<iostream>
using namespace std;
 
class A
{
public:
	A(int a = 0, int b = 0)
	{
		this->a = a;
		this->b = b;
		cout << "我是爸爸构造"<<  endl;
	}
	~A()
	{
		cout <<"我是爸爸析构" << endl;
	}
	void printfB1()
	{
		cout << "爸爸b=" << b << endl;
	}
	int get()
	{
		return b;
	}
public:
	int a;
	int b;
};
class B :public A
{
public:
	B(int b = 0, int c = 0) 
	{
		this->b = b;
		this->c = c;
		cout << "我是儿子构造"<<  endl;
	}
	~B()
	{
		cout << "我是儿子析构"<< endl;
	}
	void printfB2()
	{
		cout <<"儿子b="<< b<< endl;
	}
	int get()
	{
		return b;
	}
public:
	int b;
	int c;
};
 
int main()
{
	//同名的成员变量相互独立,而同名的成员函数会发生覆盖。
	B b1;
	A a1;
	cout << "=====" << endl;
	//同名成员变量 
	b1.b = 11;
	b1.B::b = 12;
	b1.A::b = 22;
	b1.printfB1();
	b1.printfB2();
 	cout << "=====" << endl;
	//同名成员函数
	cout << b1.get()<< endl;//b1.B::get()
	cout << b1.B::get()<< endl;
	cout << b1.A::get()<< endl;
	cout << "=====" << endl;
	
}

1.6 派生类中的static关键字

1.6.1 静态数据成员

  • 基类定义的静态成员, 将被所有的派生类共享。
  • 静态数据成员在程序中只有一份拷贝, 由该类型的所有对象共享访问。
  • 静态数据成员和普通数据成员一样遵从访问控制原则。

1.6.2 静态成员函数

  • 出现在类体外的函数定义不能指定关键字static 。
  • 静态成员函数只能访问静态数据成员和静态成员函数。
  • 静态成员函数也遵从访问控制原则。

1.6.3 代码

#include<iostream>

using namespace std;

class Base
{
public:
    //定义一个静态成员
    static int i;
    void print()
    {
        cout << "i: " << i << endl;
    }
    //静态成员函数只能在类的内部定义
    //只能使用静态成员函数和静态数据成员
    static void Add1()
    {
        i++;
    }
};
//对静态成员显式地进行初始化,让编译器分配内存空间
int Base::i = 0;

class Derived : public Base
{
public:
    void print()
    {
        cout << "i: " << i << endl;
    }
    static void Add2()
    {
        i += 2;
    }
};

int main()
{
    //在使用时,所有的基类和派生类对象使用的是同一个静态成员
    Base b1;
    b1.i = 2;
    b1.print();

    Derived d1;
    d1.print();
    d1.i = 5;
    d1.print();
    b1.print();

    b1.Add1();
    b1.print();

    d1.Add2();
    b1.print();
    d1.print();
    return 0;
}


1.7 多继承带来的二义性

参考 C++多继承中二义性的解决方案

1.7.1 什么是多重继承的二义性

如果一个派生类从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的成员变量进行访问时,可能产生二义性

1.7.2 解决办法

 
#include <iostream>
using namespace std;
 
class A{
public:
	int a;
	void f(){
		cout << "A.f() " << endl;
	};
};
 
class B1 : public A{
//class B1 : virtual public A{//【解决办法1】虚继承
public:
	int b1;
};
 
class B2 : public A{
//class B2 : virtual  public A{
public:
	int b2;
};
 
class C : public B1, public B2{
public:
	int c1;
	void f(){//【解决办法3】同名覆盖
		B1::f();
        cout << "C.f() " << endl;
    }
};
 
int main(){
	C  c1;
	c1.b1 = 100;
	c1.b2 = 200;
	c1.c1 = 300;
 
 //【解决办法1】虚继承
//	c1.a = 500; //继承的二义性 和 虚继承解决方案
 	
// 	【解决办法2】类名限定
	cout << c1.B1::a << endl;
	cout << c1.B2::a << endl;
// 【解决办法3】同名覆盖
	c1.f();

	return 0;
}

2.多态

2.1 静态多态

静态多态是编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型的转换),可推断出要调用哪个函数,如果有对应的函数就调用该函数,否则出现编译错误

2.2 动态多态

动态多态的实现条件

  • 继承
  • 基类中必须包含虚函数,并且派生类一定要对基类中的虚函数进行重写
  • 通过基类对象的指针或引用调用虚函数
#define _CRT_SECURE_NO_WARNING 1
 
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
using namespace std;
 
class FittingRoom
{
public:
	void GoToManFittingRoom()
	{
		cout<<"Man--->Please go to left"<<endl;
	}
	void GoToWomanFittingRoom()
	{
		cout<<"Woman--->Please go to right"<<endl;
	}
};
 
class Person
{
public:
	virtual void GotoFitttingRoom(FittingRoom& ft) = 0;
};
 
class Man:public Person
{
public:
	virtual void  GotoFitttingRoom(FittingRoom& ft)
	{
		ft.GoToManFittingRoom();
	}
};
 
class Woman:public Person
{
public:
	virtual void  GotoFitttingRoom(FittingRoom& ft)
	{
		ft.GoToWomanFittingRoom();
	}
};
 
void TestFittingRoom()
{
	FittingRoom ft;
	Person* p = NULL;
	for(int i = 1; i <= 10; ++i)
	{
		if( (rand()%i) & 0x01)
			p = new Man;
		else
			p = new Woman;
		p->GotoFitttingRoom(ft);
		delete p;
		Sleep(1000);
	}
}
 
int main()
{
	TestFittingRoom();
	return 0;
}

C++进阶六:继承和多态 一个类里面定义了虚函数,那么编译阶段,编译器给这个类类型产生一个唯一的vftable虚函数表,虚函数表中主要存储的内容就是RTTI指针(类类型信息指针)和虚函数的地址。当程序运行时,每一张虚函数表都会加载到内存的.rodata区。 阅读详情

相关推荐

C++之继承探究(六):虚函数和多态

前文:C++之继承探究(五):子类对象作父类对象使用 虚函数的使用   当父类指针或引用指向子类对象,而子类中又覆盖了父类的函数,希望用父类指针或父类引用,调用到正确版本的函数(父类指针或引用实际所指向的对象版本的函数),需要把该成员函数声明为虚函数。   虚函数可实现多态 例1: 附例1代码: //小问学编程 #include<iostream> using namespace std; class Base { public: virtual void func()//加了vir.

小勇博客 545

继承与多态-2

1、(继承与多态)设计Person(人)、Student(学生)、Employee(雇员)、Faculty(教员)、Staff(职员)类,Student、Employee是Person的子类,Faculty、Staff是Employee的子类。所有人都有姓名、地址、电话号码、电子邮件地址。学生有班级状态:大一、大二、大三、大四,将这些状态定义为常量。一个雇员涉及办公室、工资、受聘日期(使用Date...

程序员T T的博客 1508

【项目实战】Qt6 录制屏幕、录制声音生成MP4、AVI、MA3等(完整源码,可直接编译使用)

本文将详细介绍如何利用Qt6多媒体模块中的QMediaCaptureSession、QMediaRecorder、QScreenCapture、QAudioInput、QMediaFormat等功能,实现对屏幕和声音的录制,并生成常见的媒体格式文件,如MP4、AVI、MA3等。我们将探讨如何利用这些功能来实现灵活的视频和音频参数设置,以满足不同需求下的录制和生成要求。我们将重点讨论如何配置视频和音频参数,包括分辨率、帧率、编解码器选择、音频采样率、声道设置等。

yegu001的博客 4939

【C++】继承与多态

C++继承与多态万字详解!!

Pursue quality, not quantity. 2257

船舶轨迹预测中的5个常见坑:基于LSTM单步预测的避坑实践

本文针对船舶轨迹预测中LSTM单步预测的常见问题,系统总结了五个典型陷阱及避坑实践。重点分析了如何正确处理AIS数据的非均匀采样与清洗、对航向角进行周期性编码、采用轨迹级归一化策略、缓解单步滚动预测的误差累积,并设计贴合业务的评估指标。这些实践能有效提升预测模型的准确性与实用性。

cnn8visionary的博客 631

Python环境搭建和LabVIEW中的调用

本文主要介绍Python相关的环境搭建、Anaconda的使用以及在LabVIEW中调用Python的方法。

lvxisi的博客 6390

C++——继承和多态

多态: 多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。 C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 多态性是面向对象程序设计的关键技术之一。若程序设计语言不支持多态性,不能称为面向对象的语言。利用多态性技术,可以调用同一个函数名的函数,实现完全不同的功能。 1.1两种多态: 1.1.1编译时多态(早绑定): 编译时的多态通过函数的重载和运算符的重载来实现的。 就像是未出生的男女孩定下的娃娃亲。 1.1.2运行时多态(晚绑定)

weixin_57133901的博客 2627

SageMath下载与安装

SageMath的下载与安装

旺旺的碎冰冰~的博客 7495

C++继承和多态

继承和多态

weixin_39861267的博客 3101

Matcap与菲涅尔

菲尼尔效果(简化版公式):fresnel = base + scale*((1-v*n)^power)透明队列为后前渲染,不关闭深度写入则会覆盖之前的像素,导致混合不了。y的值为0~1,根据x3返回对应y值。两色混合做个demo看看!混合为什么要关闭深度写入?

weixin_62773441的博客 371

基于YOLOv11的气象目标检测系统:台风眼与钩状回波检测

气象目标检测是计算机视觉在气象领域的重要应用,对台风预警和强对流天气监测具有重要意义。本文详细介绍了一种基于YOLOv11的气象目标检测系统,能够有效识别卫星云图中的台风眼和雷达图中的钩状回波。系统包含完整的数据处理流程、模型训练策略以及用户友好的Web界面。我们使用了公开的气象数据集进行训练和验证,并提供了完整的实现代码。实验结果表明,本系统在气象目标检测任务中达到了较高的准确率和实用性。关键词:气象目标检测;YOLOv11;台风眼检测;钩状回波;深度学习;计算机视觉台风眼检测数据集。

YOLO 474

【C++面向对象】六、封装、继承和多态

生活中的多态,是指的客观的事物在人脑中的主观体现。例如,在路上看到一只哈士奇,你可以看做是哈士奇,可以看做是狗,也可以看做是动物。主观意识上的类别,与客观存在的事物,存在is a的关系的时候,即形成了多态。在程序中,一个类的引用指向另外一个类的对象,从而产生多种形态。当二者存在直接或者间接的继承关系时,父类引用指向子类的对象,即形成多态。多态是面向对象三大特性之一,记住继承是多态的前提,如果类与类之间没有继承关系,也不会存在多态。

咖喱年糕的博客 1389

全网最全-QCC51xx-QCC30xx(TWS)系列从入门到精通开发教程汇总(持续更新中)

QCC3040开发笔记之基本介绍(0) QCC3040开发笔记之开发环境搭建(1) QCC3040开发笔记之debug调试(trb调试,usbt调试,adb调试,WIFI调试)(2) QCC3040开发笔记之按键配置(3) QCC3040开发笔记之按键切换(4) QCC3040开发笔记之按键逻辑(5) QCC3040开发笔记之tone(6) QCC3040开发笔记之提示音(7) QCC3040开发笔记之bitserial接口(8) QCC3040开发笔记之双mic+AEC+ANC(9...

心跳包的博客 3万+

C++基础(六)——继承和多态

01 继承的基本意义 继承的本质: a.代码的复用 b.类和类之间的关系: 组合:a part of… …一部分的关系 继承:a kind of… …一种的关系 继承方式 基类的访问限定 派生类的访问限定 (main)外部的访问限定 public ​ public public Y ​ protected protected N ​ private 不可见的 N protected

yttt的博客 272

YOLOv11 改进入门篇 | 从原理到代码:CBAM 注意力模块的插入与涨点验证

本文介绍了如何在YOLOv11模型中插入CBAM注意力模块以提升检测性能。CBAM包含通道和空间注意力两个子模块,通过双池化操作和MLP学习特征权重。文章详细解析了CBAM原理,提供了PyTorch实现代码,并建议在YOLOv11的Stage-3和Stage-4之间插入CBAM。实验表明,该方法在COCO数据集上使nano和small模型的mAP提升1.7-2.3个百分点,参数量仅增加0.27%,推理延迟增加0.1ms。最后给出了插入位置选择、通道缩减比等调优建议,验证了CBAM作为轻量级注意力模块的有效性

shrgegrb的博客 1301

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++学习笔记(六)——继承、多态

写本系列的目的(自用)是回顾已经学过的知识、记录新学习的知识或是记录心得理解,方便自己以后快速复习,减少遗忘。以前三天打鱼两天晒网地学习C++,一直无法对C++熟练掌握,核心的面向对象编程并不熟悉,STL语法只会部分,因此也希望自己未来能做到熟悉甚至精通C++。

qq_65078669的博客 990

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++基础从0到1入门编程(六)- 类继承、类多态

本文详细介绍了类的继承和多态

BigDavid123的博客 1084

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++继承性和多态性(六)

5.多重继承: 一个派生类同时继承多个基类,叫做多重继承。 声明多重继承的方法: 如果已声明了类A、类B和类C,可以声明多重继承的派生类D: class D : public A,private B,proteced C {类D新增加的成员}; 多重继承派生类的构造函数: 派生类构造函数名(总参数列表): ...

angyongq537199的博客 200

C++继承与多态六:虚基类、虚继承、多重继承中菱形继承问题及解决方案

文章目录一、虚基类和虚继承二、虚基类和虚继承出错情况分析三、菱形继承问题 一、虚基类和虚继承 虚基类:被虚继承的类,就称为虚基类。 virtual作用: 1.virtual修饰了成员方法是虚函数。 2.可以修饰继承方式,是虚继承。被虚继承的类就称为虚基类。 vfptr:一个类有虚函数,这个类生成的对象就有vfptr,指向vftable。 vbptr:在派生类中从基类虚继承而来。 vftable:第...

Rain的博客 796

C++ 类学习总结(六) 继承与多态(续)

基类 定义基类 ①.成员函数 用作基类的类通常会包含两种成员函数:一是希望派生类进行覆盖自己实现的函数,定义为虚函数;二是希望派生类直接继而不改变实现的函数。 ②.虚析构函数 基类的析构函数必须是虚函数,为了多态时能执行动态绑定从而正确的释放内存。 ③.受保护成员 使用关键字 protected 来声明受保护的成员。类似私有成员,类外不可访问;类似共有成员,派生类及友元可以访问;派生类从成员或者友元只能通过派生类对象访问基类受保护成员。 class Base { public: Base() =

编程猿来如此 318

C++—继承与多态

一、类继承    C++是一种面向对象的语言,最重要的一个目的就是——提供可重用的代码,而类继承就是C++提供来扩展和修改类的方法。类继承就是从已有的类中派生出新的类,派生类继承了基类的特性,同时可以添加自己的特性。...

帅气的羊的博客 2万+

C++封装、继承、多态

C++封装继承多态总结 面向对象的三个基本特征 面向对象的三个基本特征是:封装、继承、多态。其中,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现另一个目的——接口重用! 封装

ruyue_ruyue的专栏 10万+

【c++ 封装、继承、多态】

函数运行的版本不是一开始就确定好了的而是在程序运行的时候才选择函数运行的版本,至于到底选择哪个函数版本取决于调用该函数的指针或者引用实际绑定的数据对象。

小呆鸟blog 6763

C++中的继承与多态

本文深入探讨了C++中的类继承机制,解释了继承的基本概念、语法格式及其在工程中的应用。文章详细介绍了类继承的三种方式(public、protected、private)及其对访问权限的影响,强调了public继承的广泛适用性。此外,文章还讨论了基类与派生类之间的赋值兼容性、内存切片现象以及继承中的作用域问题。通过示例代码和图示,文章展示了继承中可能出现的特殊现象,如隐藏和覆盖,并提供了实际代码运行结果以加深理解。最后,文章总结了继承在C++编程中的重要性,强调了其在扩展类功能和提高代码复用性方面的优势。

m0_73987904的博客 2110

C++继承与多态

本文介绍了C++继承与多态,基于施磊老师的C++课程。

source7777的博客 2010
上一篇: 【C++】五、拷贝构造与赋值构造
下一篇: 特征向量的欧式距离与余弦距离——推荐算法
左耳听风
博客等级 码龄12年 325粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值