南阳网站制作哪家好网站图标在哪里做修改
news/
2025/9/24 7:45:47/
文章来源:
南阳网站制作哪家好,网站图标在哪里做修改,平台搭建阳光房是否违章建筑,建设网站的初步需要引用
之前遇到一次函数调用结果的问题#xff0c;今天在这里做一下记录。 一个基类#xff0c;一个派生类#xff0c;两个类中都有一个函数名相同#xff0c;参数相同#xff0c;参数不同的函数#xff0c;创建基类指针指向派生类对象#xff0c;调用相应的函数#x…引用
之前遇到一次函数调用结果的问题今天在这里做一下记录。 一个基类一个派生类两个类中都有一个函数名相同参数相同参数不同的函数创建基类指针指向派生类对象调用相应的函数派生类指针指向基类对象调用相应的函数求其输出结果。 具体看下面的示例。
示例
开发环境
visual Studio 2017控制台输出程序。创建项目后自动生成相应的main.cpp文件本文的代码全部都是在main.cpp中编写。
示例代码
main.cpp
#include iostream
using namespace std;class TransferBase
{
public://int Fun() { cout endl; }//无法重载仅按返回值区分的函数Fun()void Fun() { cout TransferBase::Fun() endl; }virtual void Fun(int a) { cout TransferBase::Fun(int a) endl; }
private:
};class TransferDerived :public TransferBase
{
public:void Fun(int a) { cout TransferDerived::Fun(int a) endl; }//TransferDerived中的Fun(int a)与TransferBase中的Fun(int a)为多态TransferDerived中的Fun(int a)与TransferBase中的Fun()为隐藏void Fun() { cout TransferDerived::Fun() endl; }//TransferDerived中的Fun()函数与TransferBase中的Fun()函数为隐藏关系
private:};int main()
{//类之间函数调用TransferBase *pBase new TransferDerived;TransferDerived *pDeri dynamic_castTransferDerived*(new TransferBase);//“dynamic_cast” : “TransferBase”不是多态类型 ,基类指针转换为派生类指针的前提是基类必须有虚函数否则编译错误转换失败,派生类指针指向为nullptrpBase-Fun();pBase-Fun(2);//pDeri为nullptr,未转换成功 pDeri-Fun();//此句正常执行pDeri-Fun(3);//pDeri为nullptr此句崩溃
}上述的代码使用dynamic_cast将基类指针强转为派生类指针失败其指针pDeri为空运行pDeri-Fun(3);时出现崩溃但是为什么在执行pDeri-Fun();的时候能正常执行呢 原因纯属意外。
dynamic_cast使用注意事项
1.用于类类型之间的强转。一般用于将基类指针转换为派生类指针或将派生类指针转换为基类指针但是将基类指针转换为派生类指针有一个前提基类中必须要有虚函数 2.指针强转失败返回值为nullptr. 上述main函数中创建派生类指针指向基类对象一开始没有在基类中编写虚函数因而编译的时候无法通过在基类中增加了虚函数之后TransferDerived pDeri dynamic_castTransferDerived(new TransferBase);才能编译通过。但上述派生类指针指向依旧为空也就是基类的对象并没有强转成功。 其没转换成功的原因是派生类继承自基类含有基类的一些函数可以自动转换为基类而基类是不含有派生类中的函数开辟的内存无法满足派生类的内存直接访问会导致内存越界故而无法直接转换为派生类。
为了使基类的对象转换为派生类对象这时需要做下面的一些修改。
修改后的示例代码
上述使用dynamic_cast后没有成功将基类对象转换为派生类对象这里先将基类的指针指向派生类对象后将指向派生类对象的指针强转为派生类指针。下面是改动后的代码
int main()
{
//类之间函数调用TransferBase *pBase new TransferDerived;TransferDerived *pDeri dynamic_castTransferDerived*(new TransferBase);//“dynamic_cast” : “TransferBase”不是多态类型 ,基类指针转换为派生类指针的前提是基类必须有虚函数否则编译错误转换失败,派生类指针指向为nullptr//使基类指针转换为派生类指针转换成功——先将基类指针指向派生类对象再将基类指针转换为派生类指针TransferDerived derive;TransferBase *base derive;pDeri dynamic_castTransferDerived*(base);//pDeri不为nullptr,基类指针转换为派生类指针成功//转换成功pDeri不为nullptrpBase-Fun();pBase-Fun(2);pDeri-Fun();pDeri-Fun(3);
}运行结果 总结
上述涉及到的知识点 1.虚函数的使用 2.隐藏、重载、重写的区别 3.数据强转dynamic_cast. 以上是此篇文章需要具备的知识点。本文仅以记录。有关隐藏、重载、重写的介绍可以查看我之前的文章进行了解。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/915237.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!