不可或缺 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 ...
随机推荐
- 跟我一起云计算(6)——openAPI
介绍 Open API即开放API,也称开放平台. 所谓的开放API(OpenAPI)是服务型网站常见的一种应用,网站的服务商将自己的网站服务封装成一系列API(Application Program ...
- 解析for循环
循环的作用就是让一个程序.连续进行一遍又一遍的循环: for循环: 分为四大类: 初始状态:相当于他一开始的数值,或条件: 循环条件:满足进行循环,不满足则停止: 循环体:循环的东西,程序: 状态改变 ...
- MyBatis学习总结(七)——Mybatis缓存
一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...
- Atitit mtp ptp rndis midi协议的不同区别
Atitit mtp ptp rndis midi协议的不同区别 1. PTP:1 2. MTP:1 3. Mtp 与usb区别2 4. 不过和UMS相比,MTP也有不足之处:3 5. MTP协议介 ...
- C#并行编程-相关概念
菜鸟初步学习,不对的地方请大神指教,参考<C#并行编程高级教程.pdf> 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C# ...
- SpringMVC与mybatis整合
一.逆向工程生成基础信息 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generator ...
- vue-cli创建项目
- JS原生第四篇 (帅哥)
1.1 1. 循环 for(初始化; 退出条件; 增量) { } while(退出条件) { } do { 语句 } while(退出条件) 2. switch( ) 多选1 ...
- 浅谈attr()和prop()
刚开始学JQ的时候 ,看到attr()和prop()这两个属性的时候感觉很迷茫,而且配合官方给出的推荐使用图: prop()可以做到的attr()完全都可以,而且做不到的attr()也可以做到.何用? ...
- ::after::before清除浮动原理
先来看一段代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...