首页 > 编程语言 >C++ 虚基类

C++ 虚基类

时间:2023-07-19 11:11:43浏览次数:41  
标签:继承 基类 C++ 实例 派生类 共享 冗余

虚基类(Virtual Base Class)在面向对象编程中的作用是解决多重继承中的菱形继承问题(Diamond Inheritance Problem)和共享基类问题(Shared Base Class Problem)。

菱形继承问题是指当一个类以多种路径继承自同一个基类时,会导致该基类在派生类中存在多个实例,造成冗余和二义性。虚基类通过在派生类中使用虚继承来解决菱形继承问题。虚基类允许在派生类中共享同一个基类实例,从而消除了冗余和二义性。

共享基类问题是指在多重继承中,派生类的不同分支共享同一个基类,但每个分支通过独立的路径继承,导致基类在派生类中存在多个实例。虚基类可以用于共享基类,确保派生类中的虚基类实例只有一个,从而避免数据冗余和一致性问题。

虚基类的主要作用是:

  1. 消除冗余:通过使用虚基类,避免在派生类中出现多个基类实例,从而消除了数据和函数的冗余。

  2. 解决二义性:在菱形继承中,虚基类确保派生类只有一个基类实例,消除了由多个路径继承引起的二义性问题。

  3. 维护一致性:通过共享基类实例,虚基类确保派生类中的基类数据保持一致,避免了数据一致性问题。

相关:C++ 虚基类

 

#include <iostream>
using namespace std;
class Base0 {
public:
	int var0;
	void fun0() { cout << "Member of Base0" << endl; }
};
class Base1 : virtual public Base0 {
public:
	int var1;
};
class Base2 : virtual public Base0 {
public:
	int var2;
};

class Derived : public Base1, public Base2 {
	//定义派生类Derived 
public:
	int var;
	void fun() {
		cout << "Member of Derived" << endl;
	}
};

int main() {
	Derived d;
	d.var0 = 2; //直接访问虚基类的数据成员
	d.fun0();   //直接访问虚基类的函数成员
	return 0;
}

结果:Member of Base0

标签:继承,基类,C++,实例,派生类,共享,冗余
From: https://www.cnblogs.com/strive-sun/p/17565041.html

相关文章

  • 《C++》拷贝和替换算法
    copy复制容器元素到新容器 vector<int>v3; v3.resize(v1.size()); copy(v1.begin(),v1.end(),v3.begin());replace元素值替换 replace(v3.begin(),v3.end(),0,100);//replace(开始,结束,旧值,新值);replace_if条件元素值替换classFindCondition{public: booloperator()(......
  • C++——生成UUID
    #include<sstream>#include<random>#include<string>unsignedintrandom_char(){std::random_devicerd;std::mt19937gen(rd());std::uniform_int_distribution<>dis(0,255);returndis(gen);}std::stringgenera......
  • 如何向已有的项目中添加C/C++代码?
    第一步:我们需要在src/main下面建立一个cpp目录,然后在其中写一个CMakeLists.txt文件和一个cpp文件,直接给出代码:#CMakeLists.txt文件#FormoreinformationaboutusingCMakewithAndroidStudio,readthe#documentation:https://d.android.com/studio/projects/add-n......
  • 2014 蓝桥杯 预赛 c/c++ 本科B组 第八题:蚂蚁感冒(10')(4.9更新)
    第八题:蚂蚁感冒(10')  长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。   每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。  当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。  这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把......
  • 2014 蓝桥杯 预赛 c/c++ 本科B组 第三题:李白打酒 (8' )
    第三题:李白打酒(8')  话说大诗人李白,一生好饮。幸好他从不开车。  一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:  无事街上走,提壶去打酒。  逢店加一倍,遇花喝一斗。  这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。......
  • 深入解析 C++ 中的 ostringstream、istringstream 和 stringstream 用法
    引言:在C++中,ostringstream、istringstream和stringstream是三个非常有用的字符串流类,它们允许我们以流的方式处理字符串数据。本文将深入探讨这三个类的用法和特性,帮助读者更好地理解和应用字符串流操作。1.ostringstream(输出字符串流)ostringstream是C++中用于输出字......
  • C++并行程序设计
    什么是并发?两个或两个以上事件或活动在同一时刻发生。如多个任务在多个CPU或CPU的多个核上同时执行,不存在CPU资源的竞争、等待行为并发程序的意义何在?充分发掘多核处理器的性能,提高计算速率仅供初次学习此内容创作,如有不对请大佬指正前置并行计算基础理论背景......
  • c++ 参数引用传递
    1#include<iostream>2#include<thread>3#include<windows.h>4usingnamespacestd;5voidA(int&a){6cout<<"address"<<&a<<endl;;7cout<<"value"<<a......
  • 【CJsonObject】C++ JSON 解析器使用教程
    能选封装的尽量不使用底层的一、CJsonObject简介CJsonObject是Bwar基于cJSON全新开发一个C++版的JSON库。CJsonObject的最大优势是轻量、简单好用,开发效率极高,尤其对多层嵌套json的读取和生成、修改极为方便。CJsonObject比cJSON简单易用得多,且只要不是有意不......
  • C++ 网络编程 asio 使用总结
    概述Asio是一个用于网络和低级I/O编程的跨平台C++库,它使用现代C++方法为开发人员提供一致的异步模型.io_contextio_context类为异步I/O对象的用户提供了核心I/O功能,包含:asio::ip::tcp::socketasio::ip::tcp::acceptorasio::ip::udp::socketasio::deadline_timer......