【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

FPGA学习之路—应用程序—原码二位乘法器及Verilog代码分析

FPGA学习之路——原码二位乘法器及Verilog代码分析 原理 原码乘法可以分为原码一位乘和原码二位乘,两者在实现规则上大同小异。原码一位乘每次判断乘数的最低位,对被乘数和部分积进行相应操作。而原码二位乘则是对乘数的低二位进行判断,并执行相关操作。 两位乘数的取值可以有四种可能组合,每种组合对应于以下操作: 00相当于0x,部分积Dresult右移2位,不进行其他运算; 01相当于1x,部分积D...

谦豫 3716

【C++】继承与多态

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

Pursue quality, not quantity. 2257

STM32入门教程:车牌识别

在本文中,我们介绍了如何使用STM32实现车牌识别功能,并提供了详细的代码案例。通过以上步骤,你可以开始开发自己的车牌识别系统了。希望本文对你有所帮助!

2401_85258012的博客 874

达摩院高清人像美肤模型ABPN的深入解析及编程实现

本文深入解析了达摩院高清人像美肤模型ABPN的原理,并提供了相应的源代码实现。ABPN模型通过自适应的反投影网络,有效地实现了人像图像的美肤处理。通过进一步的研究和优化,ABPN模型有望在人像美肤领域发挥更大的作用。低频特征提取器用于提取输入图像的低频信息,而反投影网络则负责将低频信息与原始图像结合,生成美肤后的输出图像。通过将输入图像送入ABPN模型,即可得到经过美肤处理后的输出图像。通过对输入图像进行美肤处理,可以有效地去除皮肤上的瑕疵和噪点,提升图像质量和美感。

TechPulseZ的博客 711

C++——继承和多态

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

weixin_57133901的博客 2627

甲基化生物信息学分析及批次效应校正全流程

本文系统阐述了DNA甲基化数据分析中的批次效应问题及解决方案。甲基化数据(β值和M值)对实验批次差异高度敏感,可能导致假阳性结果。文章详细介绍了批次效应检测方法(PCA可视化、BEclear定量评分)和校正流程,包括数据预处理、参数化(ComBat-met)与非参数化(BEclear)校正方法,并提供了完整的R代码实现。重点解决了β值有界分布与统计模型假设冲突的问题,为甲基化研究的可靠性提供技术保障。

huanghm88的专栏 108

C++继承和多态

继承和多态

weixin_39861267的博客 3101

华为OD机试 - 城市聚集度(Python/JS/C/C++ 2025 A卷 200分)

华为OD机试 2025A卷题库疯狂收录中,刷题。

学Java,找哪吒 1130

基于simulink创建一个针对双馈异步风力发电机并网运行的仿真模型

摘要:本文详细介绍了基于Simulink的双馈异步风力发电机(DFIG)并网运行仿真建模方法。系统包含风速输入、风力机、双馈发电机、电力电子变换器、控制器和并网接口等模块,通过8个步骤完整呈现了建模流程,包括风速模拟、机械功率计算、发电机特性建模、变流器控制策略设计等关键环节。仿真可评估系统在不同风速条件下的动态响应、最大功率跟踪能力和发电效率,为风力发电系统的优化设计提供有效验证手段。模型可根据实际需求扩展环境因素和电网交互等细节,提高仿真精度。

amy_mhd的博客 333

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

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

咖喱年糕的博客 1389

[27] cuda 应用之 核函数实现图像通道变换

[27] cuda 应用之 核函数实现图像通道变换

yohnyang的博客 202

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

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

yttt的博客 272

YOLO+OpenClaw缺陷检测智能体 | 低代码工业质检自动化方案 | 含YOLO模型训练/智能体集成/任务全流程,支持离线日报/预警/趋势分析,解决实时性瓶颈问题(下篇)

某PCB板制造商需要对生产线上的PCB板进行缺陷检测,主要检测划痕、凹坑、污渍和裂纹等缺陷。原有人工检测方式效率仅为200件/小时,漏检率达5%,且检测人员长期工作易疲劳。

qq_36130719的博客 205

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

qq_65078669的博客 990

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

BigDavid123的博客 1084

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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、付费专栏及课程。

余额充值