二义性 , 虚基类 virtual

2024-02-25 07:38
文章标签 基类 virtual 二义性

本文主要是介绍二义性 , 虚基类 virtual,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二义性:向一个对象发送消息不明确。
发送消息:对象.成员

1、单继承:父子继承时,出现同名现象
    Class a;
    Class b:public a
    作用域的屏蔽:子类会屏蔽父类
解决二义性:作用域
    b.父类::父类成员

2、重写(覆盖):如果父子类出现同名且同形参方法,子类的作用域会覆盖父类。
  注:父类还是存在  

3、虚基类:
      关键字:   virtual 
      解决问题:防止公共基类中多继承中出现重复继承
        class A
        {
        };
        class B :virtual public A
        {
        }
        class C:virtual public A
        {
        };
        class  D:public B,public C   在D中出现公共基类问题
        {
        };
        注: 初始化必须由该子类(D:包含公基类)来构造公基类

#include<iostream>
#include<string>
using namespace std;
//共基类
class people
{
public://无参构造器people(){}people(int i,const char* n):id(i),name(n){}void show(){cout<<"people::"<<"id:"<<id<<" name:"<<name;}
protected:int id;string name;
};//学生类:people
class student:virtual public people
{
public:	//构造:子类构造自己和继承(父类的构造方法)student(int i,const char* n,short s):people(i,n),score(s){}void display(){cout<<"student::";this->show();cout<<" score:"<<score<<endl;}
protected:short score;
};
//老师类:人类
class teacher:virtual public people
{
public:teacher(int i,const char* n,int g):people(i,n),grade(g){}void display(){cout<<"teacher::";this->show();cout<<" grade:"<<grade<<endl;}
protected:int grade;//年级
};
//博士:学生,老师
class doctor:public student,public teacher
{
public:doctor(int i,const char* n,int se,int g,const char* sch):school(sch),student(1001,n,se),teacher(2001,n,g),people(i,n){}protected:string school;//学校
};int main()
{doctor zn(1001,"zn",1001,3,"中科大");//zn.display();//	二义性(doctor有两个display)zn.teacher::display();//输出tacher中的show方法zn.student::display();//输出student中的show方法//输出ID和姓名//zn.people::show();//因为有两份people::showzn.teacher::show();zn.show();//由于该类中有一份拷贝 cout<<endl<<sizeof(zn)<<endl;	
}

  上图中Student 类和Teacher类都继承了people类(共基类) , 所以在继承的时候需要 virtual 来继承(虚基类) , 这样就会为子类申请一个指针空间来指向共基类的地址 , Student类会申请一个指针 , Teacher也会申请一个指针 .  

图中的Student   和   Teacher  都会初始化一次people  ,  为了避免出现这种错误 , 所以需要people  自己来初始化 .

  所以  :  doctor(int i,const char* n,int se,int g,const char* sch):school(sch),student(1001,n,se),teacher(2001,n,g),people(i,n){}

这篇关于二义性 , 虚基类 virtual的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/744812

相关文章

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt

C++中继承及virtual小结

一、继承基础知识 C++中的继承 1.1继承的基本概念 类与类之间的关系 has-A,包含关系,用以描述一个类由多个“部件类”构成,实现has-A关系用类的成员属性表示,即一个类的成员属性是另一个已经定义好的类。 use-A,一个类使用另一个类,通过类之间的成员函数相互联系,定义友元或者通过传递参数的方式来实现。(和组合不同) is-A,即继承关系,关系具有传递性。 继承的特点 子类拥有

图像处理---二义性、通路长度、Dm距离的概念

---------------------------------------------------------------------------------------------------------————————————----— 今天终将成为我们回不去的昨天!想做就做,就是现在! ----------------------------------

C++(继承与派生,虚基类,作用域标识符)

类的继承与派生: 继承关系与派生类:      类的继承,是新的类从以后类那里继承已有的特性,从已有类产生新类的过程就是类的派生,新类产生后,就具备了已有类的特征,原有的类叫做基类,产生的新类叫做派生类。 语法形式: class派生类名:继承方式―基类名1,继承方式―基类名2,…,继承方式―基类名n(派生类成员声明;};    一个派生类,可以同时有多个基类,这种情况成为多继承,同理,

vue-virtual-scroller插件实现不等高表格虚拟滚动

对于大量的表格数据加载,如果我们全部加载不仅面临加载等待时间长,容易崩溃的问题,还有可能导致浏览器缓存数据量大而导致页面使用卡顿的情况。 所以我们使用虚拟滚动加载来优化这种情况,在这里我们使用插件vue-virtual-scroller来实现虚拟滚动 安装vue-virtual-scroller插件 npm i vue-virtual-scroller -s 在main.js

穿越Java世界的继承奇旅:从基类到子类的华丽蜕变

1.为什么要继承 2.什么是继承以及继承的方式 3.继承的一些语法 4.父类成员的访问 5.关键字super 6.关键字protected 7.关键字final 8.继承与组合 一:为什么要继承 ①代码重用:继承允许我们重用、扩展或修改父类的属性和方法,而无需重新编写相同的代码。这有助于减少代码冗余,提高代码的可维护性和可扩展性。 ②实现多态:多态是面向对象编程的三大特性之

PL/SQ连接oracle,L 新建表的时候, virtual那一列是什么意思

PL/SQ连接oracle,L 新建表的时候, virtual那一列是什么意思 Virtual标示该栏位是否为虚拟列。 https://www.2cto.com/database/201306/216917.html posted @ 2017-12-14 10:46 酸奶加绿茶 阅读( ...) 评论( ...) 编辑 收藏

【并查集】 HDU 3172 Virtual Friends

HDU 3172 Virtual Friends 数据量大,不建议用cin。 #include <iostream>#include <string>#include <algorithm>#include <math.h>#include <stdio.h>#include <cstring>#include <stdlib.h>#include <map>using n

ADT后在windows菜单下找不到Android SDK Manager和Android Virtual Device Manager选项的解决办法

今天一大早打开ADT准备编译android工程的时候,突然发现windows菜单下的Android SDK Manager和Android Virtual Device Manager选项不见了。因为我昨天把一个android工程转换为了C/C++工程,就莫名其妙出了这个问题。           在网上搜了一下,找到了解决方案:            在ADT中点击windo

virtual box安装centos8.3最新版

主要步骤: 1.下载virtual box :官网下载地址:virtualbox 2.我下载的是window版,下载完,直接安装,点下一步安装完成即可 3.下载centos安装镜像:cenos下载地址:centos linux为稳定版,stream为体验版:参考:linux和strean的区别 4.8.3版开始不提供mini镜像,这里选择下载boot镜像,700M左右 5.开始安装 点击确