不可或缺 Windows Native (22) - C++: 多重继承, 虚基类
作者:webabcd
介绍
不可或缺 Windows Native 之 C++
- 多重继承
- 虚基类
示例
1、基类 1
CppBase1.h
#pragma once #include <string>
#include "CppBaseVirtual.h" using namespace std; namespace NativeDll
{
// virtual 代表 CppBaseVirtual 是 CppBase1 的虚基类(虚基类是在声明派生类时,指定继承方式时声明的)
class CppBase1 : virtual public CppBaseVirtual
{ protected:
string Name;
float Salary; public:
CppBase1(int number, string name, float salary); };
}
CppBase1.cpp
/*
* 基类 1
*/ #include "pch.h"
#include "CppBase1.h" using namespace NativeDll; CppBase1::CppBase1(int number, string name, float salary) :CppBaseVirtual(number), Name("cppbase1 " + name), Salary(salary)
{ }
2、基类 2
CppBase2.h
#pragma once #include <string>
#include "CppBaseVirtual.h" using namespace std; namespace NativeDll
{
// virtual 代表 CppBaseVirtual 是 CppBase2 的虚基类(虚基类是在声明派生类时,指定继承方式时声明的)
class CppBase2 : virtual CppBaseVirtual
{ protected:
string Name;
int Age; public:
CppBase2(int number, string name, int age); };
}
CppBase2.cpp
/*
* 基类 2
*/ #include "pch.h"
#include "CppBase2.h" using namespace NativeDll; CppBase2::CppBase2(int number, string name, int age) :CppBaseVirtual(number), Name("cppbase2 " + name), Age(age)
{ }
3、虚基类
CppBaseVirtual.h
#pragma once #include <string> using namespace std; namespace NativeDll
{
class CppBaseVirtual
{ private:
int Number; public:
CppBaseVirtual(int number); };
}
CppBaseVirtual.cpp
/*
* 用于演示虚基类
*
* 注:
* 1、虚基类并不是在声明基类时声明的,而是在声明派生类时,指定继承方式时声明的
* 2、一个基类可以在生成一个派生类时作为虚基类,也可以在生成一个派生类时不作为虚基类
*/ #include "pch.h"
#include "CppBaseVirtual.h" using namespace NativeDll; CppBaseVirtual::CppBaseVirtual(int number) :Number(number)
{ }
4、派生类
CppDerived.h
#pragma once #include <string>
#include "CppBase1.h"
#include "CppBase2.h" using namespace std; namespace NativeDll
{
class CppDerived : public CppBase1, public CppBase2
{ public:
CppDerived(int number, string name, float salary, int age); string Show(); };
}
CppDerived.cpp
/*
* 派生类
*
*
* 在多重继承的情况下:
* 1、如果 A 是 B C D E 的基类,F 同时继承了 B C D E,那么实例化 F 时会保存 4 份 A 成员
* 2、如果 A 是 B 的基类,A 是 C D E 的虚基类(虚基类会使得在继承间接共同基类时只保留一份成员),F 同时继承了 B C D E,那么实例化 F 时会保存 2 份 A 成员(从 C D E 的路径上保留一份,从 B 的路径上保留一份)
*
*
* 本例中:
* 1、CppBaseVirtual 是 CppBase1 和 CppBase2 的虚基类
* 2、CppDerived 继承了 CppBase1 和 CppBase2(多重继承)
* 3、此种情况,实例化 CppDerived 只会保留一份 CppBaseVirtual 成员(因为 CppBaseVirtual 是 CppBase1 和 CppBase2 的虚基类)
* 4、C++ 编译器只会执行最后的派生类(CppDerived)对虚基类(CppBaseVirtual)的构造函数的调用,而忽略虚基类的直接派生类(CppBase1 和 CppBase2)对虚基类的构造函数的调用,这就保证了虚基类的数据成员不会被多次初始化
*/ #include "pch.h"
#include "CppDerived.h"
#include "cppHelper.h" using namespace NativeDll; // 在无虚基类的情况下,派生类的构造函数中只需负责对其直接基类初始化
// 如果有虚基类,且虚基类中定义了带参数的构造函数,且没有定义默认构造函数,那么派生类不仅要负责对其直接基类进行初始化,还要负责对虚基类初始化
CppDerived::CppDerived(int number, string name, float salary, int age) :CppBaseVirtual(number), CppBase1(number, name, salary), CppBase2(number, name, age)
{ } string CppDerived::Show()
{
// 关于多重继承的二义性(ambiguous),如果派生类同时继承的多个基类有相同的成员,则调用这些成员时需显式指定其基类
return CppBase1::Name + " " + float2string(Salary) + " " + int2string(Age); // 另外:当然,如果派生类与多个基类有相同成员的话,那么基类中的这些与派生类相同的成员都会被隐藏掉(即派生类中的成员会覆盖基类中的成员)
}
5、示例
CppClass6.h
#pragma once #include <string> using namespace std; namespace NativeDll
{
class CppClass6
{
public:
string Demo();
};
}
CppClass6.cpp
/*
* 多重继承(multiple inheritance), 虚基类(virtual base class)
*/ #include "pch.h"
#include "CppClass6.h"
#include "CppDerived.h" using namespace NativeDll; string CppClass6::Demo()
{
CppDerived derived(, "webabcd", 100.0f, );
string result = derived.Show(); // cppbase1 webabcd 100.00 35 return result;
}
OK
[源码下载]
不可或缺 Windows Native (22) - C++: 多重继承, 虚基类的更多相关文章
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
- 不可或缺 Windows Native (20) - C++: 友元函数, 友元类
[源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...
- 不可或缺 Windows Native 系列文章索引
[源码下载] 不可或缺 Windows Native 系列文章索引 作者:webabcd 1.不可或缺 Windows Native (1) - C 语言: hello c 介绍不可或缺 Window ...
- 不可或缺 Windows Native (23) - C++: 虚函数
[源码下载] 不可或缺 Windows Native (23) - C++: 虚函数 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 虚函数 示例1.基类CppHuman ...
- C++学习之路—继承与派生(三):多重继承与虚基类
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多重继承是指一个派生类有两个或多个基类.例如,有 ...
- 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native
[源码下载] 不可或缺 Windows Native (25) - C++: windows app native, android app native, ios app native 作者:web ...
- 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换
[源码下载] 不可或缺 Windows Native (24) - C++: 运算符重载, 自定义类型转换 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 运算符重载 自 ...
- 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板
[源码下载] 不可或缺 Windows Native (19) - C++: 对象的动态创建和释放, 对象的赋值和复制, 静态属性和静态函数, 类模板 作者:webabcd 介绍不可或缺 Window ...
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, con ...
随机推荐
- netstat 1
lsof -i :8086 第二个参数需要:开头 netstat linux -a (all)显示所有选项,默认不显示LISTEN相关 理解这个很关键, 这是为什么我们netstat -a 不显 ...
- Java基础之面向对象以及其他概念
一.基础知识:1.JVM.JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性. java语言是跨平台,jvm不是跨平台的. JR ...
- 基础才是重中之重~AutoMapper为已有目标对象映射
回到目录 AutoMapper各位一定不会陌生,大叔之前的文章中也提到过,曾经也写过扩展方法,以方便程序开发人员去使用它,而在最近,大叔在一个API项目里,在一个POST请求由DTO对象为实体对象赋值 ...
- js定时器的时间最小值-setTimeout、setInterval
HTML5标准规定 setTimeout的最短时间间隔是4毫秒: setInterval的最短间隔时间是10毫秒,也就是说,小于10毫秒的时间间隔会被调整到10毫秒 书和MDC 在John Resig ...
- Atitit 马尔可夫过程(Markov process) hmm隐马尔科夫。 马尔可夫链,的原理attilax总结
Atitit 马尔可夫过程(Markov process) hmm隐马尔科夫. 马尔可夫链,的原理attilax总结 1. 马尔可夫过程1 1.1. 马尔科夫的应用 生成一篇"看起来像文章的 ...
- 让 “微软雅黑” 在IE6下完美显示
微软雅黑可以说是网页中最常见的字体了,但是往往在IE8+的浏览器上调试得很好,到了IE6则会变成默认的"宋体". 因为宋体字体宽度通常比雅黑的要宽,有时候会把页面都布局挤乱. 为了 ...
- Mybatis中SqlMapper配置的扩展与应用(3)
隔了两周,首先回顾一下,在Mybatis中的SqlMapper配置文件中引入的几个扩展机制: 1.引入SQL配置函数,简化配置.屏蔽DB底层差异性 2.引入自定义命名空间,允许自定义语句级元素.脚本级 ...
- 开源项目IPProxys的使用
前几天看了一下github上,IPProxys开源项目(https://github.com/qiyeboy/IPProxys)快100star了,看来大家对这个项目还是比较感兴趣的.最近一直没更新文 ...
- lufylegend游戏引擎
lufylegend游戏引擎介绍:click 这个链接我觉得已经很详细的介绍了这个引擎. 所以以下我只说说一些简单的游戏代码过程. 首先从canvas做游戏叙述起: 这是一个让人很熟悉的简单小游戏,网 ...
- Lookup 组件异常
Lookup组件有两个数据源,一个是上流组件的输出,一个是组件lookup的数据源,这个数据源是在Connection选项卡中进行配置.在开发package的过程中,我发现一个异常,当Lookup数据 ...