C++/CLI——3继承与值类型、操作符重载与异常

C++/CLI——3继承与值类型、操作符重载与异常

继承

C++/cli中的继承用法基本和C#中的用法相同,只不过要注意以下几点:

  1. 标准的C++在继承符号:之后,基类名称之前添加关键字public/protected/private,但是C++/CLI只支持public,所以可写可不写
  2. 标准C++声明抽象基类的方式是在内部至少将一个虚函数=0,设置为纯虚函数,而C++/CLI中则是在类声明后面加上abstract关键字
  3. 抽象函数在C++中叫做纯虚函数,也就是在虚函数后面=0,C++/CLI也支持这样做,另外第二种方式是可以在虚函数后面加上abstract关键字来表示为抽象函数
  4. C++/Cli支持密封类,也就是不能被继承,用sealed关键字ref class Myclass sealed
  5. C++/cli中抽象类和密封类可同时声明,sealed和abstact顺序任意
  6. C++/CLI不支持多继承,只能多继承接口,接口使用interface来声明interface clas IXmlWriter,且接口成员都是公共的和抽象的

案例演示:

interface class ICanShout //定义接口
{void Shout();
};ref class Animal abstract:ICanShout //定义抽象类
{
public:Animal(String^ n,int l);virtual void Eat() abstract;//抽象方法virtual void Shout() =0;//抽象方法String^ name;int legs;
};ref class Dog:Animal
{
public:Dog(String^ n,int l);void Eat() override;virtual void Shout() override;
};ref class Cat :Animal
{
public:Cat(String^ n, int l);void Eat() override;//写不写virtual都可以被重写了,因为基类定义了virtualvirtual void Shout() override;
};Animal::Animal(String^ n, int l)
{this->name = n;this->legs = l;
}Dog::Dog(String^ n, int l):Animal(n,l)
{
}void Dog::Eat()
{Console::WriteLine("我的名字是{0},我吃骨头", name);
}void Dog::Shout()
{Console::WriteLine("我会汪汪叫");
}Cat::Cat(String^ n, int l):Animal(n,l)
{}void Cat::Eat()
{Console::WriteLine("我的名字是{0},我吃鱼", name);
}void Cat::Shout()
{Console::WriteLine("我会喵喵叫");
}
//调用
int main(array<System::String^>^ args)
{Dog^ d = gcnew Dog("tom", 4);d->Eat();d->Shout();Cat^ c = gcnew Cat("jerry", 4);c->Eat();c->Shout();Animal^ a = d;a->Shout();Console::WriteLine("程序结束");
}

值类型

值类型的特点:

  1. 存在栈上
  2. 不进行垃圾回收
  3. 总是直接访问,不使用gcnew
  4. 拷贝类类型是直接拷贝
  5. 不能继承

结构

//使用value关键字
value struct  Point
{//默认publicint x, y;//构造函数不支持默认值
};

结构和类的基本区别:

  • 不能在结构定义时初始化成员,必须在构造器中初始化
  • 不能重写结构默认构造器,因为默认构造器要将所有成员设为默认值
  • 不能有析构和终结器
  • 不支持继承
  • 可实现接口

案例

value struct Line
{String^ name;Point p;
};//使用初始化器,初始化器只能是默认构造函数
Line l = { "线1",{3,4} };
Console::WriteLine(l.name);

枚举

//一定要用public 或者private来限定
//必须这样使用enum  class
public enum  class WeekDay
{Mondy,Tuesday
};
//必须使用类型名称限定
Console::WriteLine(WeekDay::Mondy);

枚举虽然是整数值,但是不能隐式转换,必须这样int day = static_cast<int>(WeekDay::Tuesday);

enum默认是int大小是32位,但是一般1个字节就可以容纳所有的值,为了节省内存,可以增加限定public enum class WeekDay:char

操作符重载

重载操作符的方法和规范基本和C++重载操作符一致,请看下面案例

value struct  IntVal
{
private:int value;
public:IntVal(int v) :value(v) {};int GetValue() { return value; }IntVal operator+(IntVal other){IntVal result(value + other.GetValue());return result;}IntVal operator+(int other){IntVal result(value + other);return result;}static IntVal operator+(int lhs, IntVal rhs){IntVal result(lhs + rhs.GetValue());return result;}
};int main(array<System::String^>^ args)
{IntVal one(1);IntVal two(2);IntVal three = one + two; //IntVal operator+(IntVal other)IntVal t = one + 2; //IntVal operator+(int other)IntVal t = 2 + one ; //static IntVal operator+(int lhs, IntVal rhs)Console::WriteLine(t.GetValue());//输出3Console::WriteLine("程序结束");
}

转换器

上面案例中仅仅实现了static IntVal operator+(int lhs, IntVal rhs),其实还需要实现(IntVal IntVal)\(IntVal,int)其实还有个更简单的办法,也就是重载转换操作符(),将int转换为IntVal。与标准C++不同,在C++中如果定义了int构造器,编译器就允许将int隐式转为IntVal,但是在C++/CLI中必须重载转换操作符

value struct  IntVal
{
private:int value;
public:IntVal(int v) :value(v) {};int GetValue() { return value; }static operator IntVal(int v) //重载转换操作符{return IntVal(v);}static IntVal operator+(IntVal lhs, IntVal rhs)//使用这一个配合重载操作符就可以替代三种签名函数{IntVal result(lhs.value + rhs.value);return result;}
};

另外,与C++不同的是,C++中+并不能自动得到+=,但是在C++/CLI中,重载+会自动得到+=,上面的重载函数完成后,可以实现

IntVal one(1);
one += 2;

递增和递减

标准C++要分别为前++和后++提供两个操作符重载,但是在C++/cli中只需要一个静态重载就可以,需注意要配合重载转换操作符

value struct  IntVal
{
private:int value;
public:IntVal(int v) :value(v) {};int GetValue() { return value; }static operator IntVal(int v) //重载转换操作符{return IntVal(v);}static IntVal operator++(IntVal i)//配合重载转换操作符{i.value++;return i;}
};int main(array<System::String^>^ args)
{IntVal one1(1);IntVal one2(1);Console::WriteLine((one1++).GetValue());Console::WriteLine(one1.GetValue());Console::WriteLine((++one2).GetValue());Console::WriteLine(one2.GetValue());Console::WriteLine("程序结束");
}

image-20240104103844420

引用类型重载操作符

为引用类型重载操作符和为值类型类似,就是要关注对象句柄

ref struct  IntVal
{
private:int value;
public:IntVal(int v) :value(v) {};int GetValue() { return value; }static operator IntVal^(int v) //重载转换操作符{return gcnew IntVal(v);}static IntVal^ operator+(IntVal^ lhs,IntVal^ rhs)//配合重载转换操作符{IntVal^ result = gcnew IntVal(lhs->value + rhs->value);return result;}
};int main(array<System::String^>^ args)
{IntVal^ one = gcnew IntVal(1);IntVal^ two = gcnew IntVal(2);IntVal^ three = one + two;IntVal^ four = two + 2;Console::WriteLine(three->GetValue());Console::WriteLine(four->GetValue());Console::WriteLine("程序结束");
}

image-20240104104435021

异常

C++/CLI中使用异常基本与C#中的使用方法相同。在动态类型转换上,safe_cast转型失败会抛出InvalidCastException,而dynamic_cast则会返回空指针。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/595294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云服务器地域怎么选择?哪个地域好?

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

基于决策树、随机森林和层次聚类对帕尔默企鹅数据分析

作者&#xff1a;i阿极 作者简介&#xff1a;数据分析领域优质创作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&#x1f44d;收藏&#x1f4c1;评论&#x1f4d2;关注哦&#x…

大数据应用安全策略包括什么

大数据应用安全策略是为了保障大数据应用中的数据安全而采取的一系列措施&#xff0c;其重要性不容小觑。以下是大数据应用安全策略所包含的主要内容&#xff1a; 一、数据加密与安全存储 数据加密&#xff1a;对于敏感数据&#xff0c;应采用加密技术进行保护&#xff0c;包括…

普中STM32-PZ6806L开发板(资料收集...)

简介 逐渐收集一些开发过程中使用到的文档资料数据手册 DS18B20 数据手册 DS18B20 Datasheet 开发文档 STM32F1各种文档 https://www.st.com/en/embedded-software/stm32cubef1.html#documentation HAL库文档开发文档 你使用的HAL文档, 在STM32CubeMX生成过程的最下面有…

『开发工具篇』- 配置 gradle 等相关依赖镜像源

『开发工具篇』- 配置 gradle 等相关依赖镜像源 1.更换gradle下载源2. 配置setting.gradlekts文件gradle文件 1.更换gradle下载源 使用腾讯云的镜像库https://mirrors.cloud.tencent.com/gradle/ gradle-x.x-all.zip&#xff1a;编译后的二进制发布版以及源码和文档gradle-x.…

chrome面向服务的架构SOA

chrome 浏览器面向服务的架构 原来的各种模块会被重构成独立的服务&#xff0c;每个服务都可以独在独立的进程中运行&#xff0c;可以在浏览器的任务管理器中看到各种服务。 "面向服务的架构"&#xff08;Service-Oriented Architecture&#xff0c;SOA&#xff09;…

Kubernetes Gateway API V1.0:您应该切换吗?

自Kubernetes Gateway API 发布 v1.0以来已经过去两个多月了&#xff0c;这标志着其一些关键 API 已经进入普遍可用状态。 去年&#xff0c;当网关 API升级为测试版时&#xff0c;我曾写过有关该 API的文章&#xff0c;但一年后&#xff0c;问题仍然存在。您是否应该从 Ingres…

自由DIY预约小程序源码系统:适用于任何行业+自由DIY你的界面布局+全新升级的UI+多用户系统 带安装部署教程

随着移动互联网的普及&#xff0c;预约服务逐渐成为人们日常生活的一部分。从家政服务、医疗挂号到汽车保养&#xff0c;预约已经渗透到各个行业。然而&#xff0c;市面上的预约小程序大多功能单一&#xff0c;界面老旧&#xff0c;无法满足商家和用户的个性化需求。今天来给大…

整合【事务】

目录 1、读未提交&#xff08;脏读&#xff09; 2、读已提交&#xff08;不可重复读&#xff09; 3、可重复读&#xff08;幻读&#xff09; 4、Navicat中模拟开启、提交、回滚事务 1、读未提交&#xff08;脏读&#xff09; 允许一个事务读取其他事务未提交的修改 2、读已…

异步优势演员-评论家算法 A3C

异步优势演员-评论家算法 A3C 异步优势演员-评论家算法 A3C网络结构并行步骤 异步优势演员-评论家算法 A3C A3C 在 A2C 基础上&#xff0c;增加了并行训练&#xff08;异步&#xff09;来提高效率。 网络结构 A2C&#xff1a; A3C&#xff1a; 在这两张图之间&#xff0c;…

安装cnpm报4048错误

记一次安装cnpm报错&#xff1a; 默认安装的是最新版本的cnpm&#xff0c;可能跟现有的npm不匹配。指定一个低版本的cnpm&#xff0c;或者升级npm到最新版本。 #指定一个cnpm的版本&#xff0c;这里是7.1.1 npm install -g cnpm7.1.1 --registryhttps://registry.npm.taobao…

【C程序设计】C循环

有的时候&#xff0c;我们可能需要多次执行同一块代码。一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了更为复杂执行路径的多种控制结构。 循环语句允许我们多次执行一个…

【C语言进阶篇】关于指针的八个经典笔试题(图文详解)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; 指针笔试题&#x1f4ad; 笔试题 1&#xff1a;✅ 代码解析⁉️ 检验结果&…

听GPT 讲Rust源代码--compiler(5)

File: rust/compiler/rustc_resolve/src/rustdoc.rs rust/compiler/rustc_resolve/src/rustdoc.rs是Rust编译器中解析文档注释的模块。该模块处理Rust源代码中的文档注释&#xff0c;提取出有用的信息&#xff0c;例如函数、结构体、枚举的名称、说明、参数、返回值等。它的主要…

羊大师讲解喝羊奶的好处多,降低脂肪风险还有不少!

羊大师讲解喝羊奶的好处多&#xff0c;降低脂肪风险还有不少&#xff01; 喝羊奶是一种非常健康的饮品&#xff0c;具有许多好处。相比于牛奶&#xff0c;羊奶含有更多的维生素和矿物质&#xff0c;对身体更有益。喝羊奶可以减少脂肪摄入&#xff0c;有助于降低患心血管疾病的…

基于Vue的宿舍管理系统

基于Vue的宿舍管理系统资源-CSDN文库 基于 Koa 以及 VueJS 的宿舍管理系统。 新增功能&#xff1a; 【楼层管理】添加『入住人员信息』模块&#xff0c;显示入住学生、性别、院系、专业的人数&#xff0c;可用饼图表示【用户信息】学生用户添加性别、院系、专业字段【楼层管理…

Gamebryo游戏引擎源码(gb2.6+gb3.2+gb4.0+中文手册)

Gamebryo游戏引擎源码&#xff0c;是源码&#xff0c;是源码&#xff0c;是源码。喜欢研究游戏的可以下载研究研究&#xff0c;代码写得很好&#xff0c;有很多借得参考的地方。 Gamebryo游戏引擎源码&#xff08;gb2.6gb3.2gb4.0中文手册&#xff09; 下载地址&#xff1a; 链…

rollup 插件开发示例

✨专栏介绍 Rollup专栏是一个专门介绍Rollup打包工具的系列文章。Rollup是一个现代化的JavaScript模块打包工具&#xff0c;它可以将多个模块打包成一个或多个文件&#xff0c;以提高应用程序的性能和加载速度。 在Rollup专栏中&#xff0c;您将学习到如何安装和配置Rollup&a…

专车数据层架构进化往事:好的架构是进化来的,不是设计来的

很多年前&#xff0c;读了子柳老师的《淘宝技术这十年》。这本书成为了我的架构启蒙书&#xff0c;书中的一句话像种子一样深埋在我的脑海里&#xff1a;“好的架构是进化来的&#xff0c;不是设计来的”。 2015 年&#xff0c;我加入神州专车订单研发团队&#xff0c;亲历了专…

将DOM结构转换成图片保存至本地或保存至剪切板

在新业务需求中&#xff0c;碰到这样一个场景&#xff0c;需要将后端返回的表格数据&#xff0c;保存至本地或者保存至剪切板&#xff0c;直接发送给用户使用。 1. 将内容转换成图片并保存至本地 1.1 交互效果 如图所示&#xff0c;想要点击复制按钮后&#xff0c;将下面这个…