虚函数和虚拟基类 用法小结

2024-05-09 18:18

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

申明:本文主要参考MSDN

继承:在继承定义中包含了virtual关键字的继承关系;

虚基类:在虚继承体系中的通过virtual继承而来的基类;


声明虚基类的一般形式为
   class 派生类名: virtual 继承方式 基类名

需要注意: 为了保证虚基类在派生类中只继承一次,应当在该基类的所有直接派生类中声明为虚基类。否则仍然会出现对基类的多次继承。

将类A声明为虚基类,方法如下:
class A//声明基类A
{…};
class B :virtual public A//声明类B是类A的公用派生类,A是B的虚基类
{…};
class C :virtual public A//声明类C是类A的公用派生类,A是C的虚基类
{…};

继承 Demo 参考来自:http://www.cnblogs.com/itech/archive/2009/03/01/1399996.html

#include <iostream>
using namespace std;class B
{
public:int i;virtual void vB(){ cout << "B::vB" << endl; }void fB(){ cout << "B::fB" << endl;}
};class D1 : virtual public B
{
public:int x;virtual void vD1(){ cout << "D1::vD1" << endl; }void fD1(){ cout << "D1::fD1" << endl;}
};class D2 : virtual public B
{
public:int y;void vB(){ cout << "D2::vB" << endl;}virtual void vD2(){ cout << "D2::vD2" << endl;}void fD2(){ cout << "D2::fD2" << endl;}
};class GD :  public D1, public D2
{
public:int a;void vB(){ cout << "GD::vB" << endl;}void vD1(){cout << "GD::vD1" << endl;}virtual void vGD(){cout << "GD::vGD" << endl;}void fGD(){cout << "GD::fGD" << endl;}
};






虚基类:
用于某类从多个类继承,这多个基类有共同基类时,这个最上层基类的成员会多次在最终派生类出现而产生二义性,为避免二义性,使得最终派生类中,最上层的基类成员只有一份,这时需要虚拟继承,该最上层类就是虚基类,需要注意的是,该类在第一层派生时就要虚拟继承才行,使用方法是在继承方式前加上一个 virtual就可以了
#include <iostream>
using namespace std;
class CBase
{
protected:int a;
public:CBase(int na){a = na;cout << "CBase constructor" << endl;}~CBase(){cout << "CBase deconstructor!" << endl;}
};
class CDerive1: virtual public CBase
{
public:CDerive1(int na) : CBase(na){cout << "CDerive1 constructor" << endl;}~CDerive1(){cout << "CDerive1 deconstructor" << endl;}int GetA(){return a;}
};
class CDerive2: virtual public CBase
{
public:CDerive2(int na): CBase(na){cout << "CDerive2 constructor" << endl;}~CDerive2(){cout << "CDerive2 deconstructor" << endl;}int GetA(){return a;}
};class CDerive12: public CDerive1,public CDerive2
{
public:CDerive12(int na1,int na2,int na3): CDerive1(na1), CDerive2(na2), CBase(na3){cout << "CDerive12 constructor" << endl;}~CDerive12(){cout << "CDerive12 deconstructor" << endl;}
};
void main()
{CDerive12 obj(100,200,300);cout << "frome CDerive1: a = " << obj.CDerive1::GetA() << endl;cout << "frome CDerive2: a = " << obj.CDerive2::GetA() << endl << endl;system("pause");
}

效果:


这篇关于虚函数和虚拟基类 用法小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点:

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意