首页 > 编程语言 >C++中虚拟继承问题

C++中虚拟继承问题

时间:2023-06-13 10:31:50浏览次数:58  
标签:继承 C++ 虚拟 内存 基类 拷贝



#include<iostream>
using namespace std;
class A{
public:
	A(char *s) {
		cout<<s<<endl;
	}
	~A(){}
};

class B: virtual public A {
public:
	B(char *s1,char *s2):A(s1){
		cout<<s2<<endl;
	}
};

class C:virtual public A {
public:
	C(char *s1,char *s2):A(s1) {
	cout<<s2<<endl;
	}
};

class D:public B,public C {
public:
	D(char *s1,char *s2,char *s3,char *s4):B(s1,s2),C(s1,s3),A(s1) {
	cout<<s4<<endl;
	}
};

int main() {
D *p=new D("class A","class B","class C","class D");
delete p;
return 0;
}



C++对象生成时的构造顺序问题,先构造继承过来的父类,然后同级按顺序构造,算下来顺序就是abcd,虚继承解决继承二义性问题。


对于D继承了BC,加上virtual之后,系统会自动加入一个虚拟继承的拷贝,首先调用虚拟基类的构造函数,之后就不会打印了。如果不加virtual的话,应该会打印两次的基类的构造函数。



-------------------------------------------------------

C++中虚拟继承:

为了解决从不同路径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致的问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。


这样就解决了二义性问题,也节省了内存,避免了数据不一致的问题。


与虚函数的关系: 虚拟继承与虚函数有一定相似的地方,但它们之间是绝对没呀任何联系的。

标签:继承,C++,虚拟,内存,基类,拷贝
From: https://blog.51cto.com/u_14939782/6467640

相关文章

  • C++学习(65)
    1关于new运算符,错误的是DA可以用来动态创建对象和对象数组B使用它创建的对象和对象数组可以使用运算符delete删除C使用它创建对象时要调用构造函数D使用它创建对象数组时必须指定初始值分析:D可以不指定初始值,调用默认构造函数进行默认初始化。int*x=newint();//不传值,默认初始化......
  • C++地址值为1(情况说明)
    关于C++中地址值打印出来为1的情况;以下是测试代码:#include<iostream>#include<iomanip>usingnamespacestd;intmain(){constvolatileinta=10;cout<<&a<<endl;int*p=(int*)&a;*p=12;cout<......
  • VM虚拟机模板,克隆或导入后网络不通问题解决办法
    出于工作需要可能需要对VM虚拟机制作模板,并导出为.vof文件,并根据vof模板文件导入为新的虚拟机,但是当导入后会发现网络不通,现将网络问题解决办法进行记录:本次实验OS为Centos7,网卡默认配置文件名为ifcfg-ens331.保留默认网卡网卡目录:/etc/sysconfig/network-scripts/保留默认......
  • 虚拟化与大数据的报错问题收录
    摘要:此文记录的是作者在学习过程中遇到的问题及解决方法,会不断更新,有些问题还未得到解决,仅供参考。如果其中问题各位有解决思路或者出现过类似情况欢迎在评论中分享,也算帮作者一把,若是出现其他问题的也可在评论留言,共同讨论,感谢各位。虚拟化技术rabbitmq无法启动的问题目前只针......
  • C++面试八股文:static和const的关键字有哪些用法?
    C++面试八股文:static和const的关键字有哪些用法?某日二师兄参加XXX科技公司的C++工程师开发岗位第7面:面试官:C++中,static和const的关键字有哪些用法?二师兄:satic关键字主要用在以下三个方面:1.用在全局作用域,修饰的变量或者函数为静态的,限制在本文件内使用。2.方法内修饰修饰静......
  • centos7 虚拟机安装 MySQL数据库
    检查是否安装过MySQL以及版本信息rpm-qa|grep-imysql卸载之前的版本,参数-e表示删除,-nodeps表示不校验依赖关系rpm-emysql-5.1.47-4.el6.x86_64–nodeps二进制包格式安装的mysql卸载如果我们的mysql是通过二级制包格式安装的,则rpm-qa|grep-imysql是......
  • C++面试八股文:了解位运算吗?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第12面:面试官:了解位运算吗?二师兄:了解一些。(我很熟悉)面试官:请列举以下有哪些位运算?二师兄:按位与(&)、按位或(|)、按位异或(^),按位取反(~)、左移(<<)和右移(>>)。面试官:好的。那你知道位运算有什么优势吗?二师兄:优势主要有两点:1.速度快。2.节......
  • VMware虚拟化抓包
    在esxi环境下可以在不同的层面下抓包,需要明白在什么地方抓包,怎么抓包才是关键,否则可能导致抓包不完整,或无法抓到自己需要的包。了解抓包位置先研究下虚拟化的结构:  下面这张图是一台ESXi主机使用标准交换机的网络架构。简单来说分为四部分:  物理上联网卡  标准交换机......
  • Parallels Desktop 虚拟机 V18.3.1 Mac版支持M
    最新版PD18.3.1破解版哪里可以下载呢?ParallelsDesktop是一款非常优秀的虚拟机应用,允许您并排运行Windows和Mac应用程序。ParallelsDesktopforMac18.3.1下载https://www.macw.com/mac/4237.html?id=ODA2NCZfJjI3LjE4Ny4yMjcuMTc2  ......
  • c++ create daemonizeMe
    daemonizeMe//Copyright(c)2017DeepAggarwal#include<getopt.h>#include<grp.h>#include<pwd.h>#include<stdlib.h>#include<syslog.h>#include<sys/stat.h>#include<sys/types.h>#include<unistd.h>#include......