首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在c++中将子类安全地转换为父类?

如何在c++中将子类安全地转换为父类?
EN

Stack Overflow用户
提问于 2022-08-21 05:44:19
回答 1查看 43关注 0票数 0

有一个子类继承自一个普通超类和一个带有虚拟function.When的超类,我将子类指针转换为普通超类指针,当我使用另一个超类指针指向子类时,它将工作correctly.But,然后将指针转换到这个普通超类,它会打印错误的答案。

代码语言:javascript
运行
复制
#include <iostream>
using namespace std;

class base{
public:
    virtual bool test1() = 0;
};

class base2{
public:
    int a;

    base2(int p) : a(p) {}
};

class son:public base, public base2 {
public:
    bool test1() {
        return true;
    }
    son(int p) : base2(p) {}
};

void out(base2* p) {
    cout << p -> a;
}

int main()
{
    
    /* if I use this, it will print a wrong number,such as -1359748056
     base * o = new son(9);
     out((base2*)o);
     */
    
    /* if I use this, it will print 9
    out(new son(9));
    */
    return 0;
}

我不知道Why.Converting子类到父类是否安全?

EN

回答 1

Stack Overflow用户

发布于 2022-08-21 05:55:34

你在行里写的东西

代码语言:javascript
运行
复制
out((base2*)o); 

称为C样式的强制转换或投射。在处理类和对象时,您几乎不应该这样做,因为它只是改变指针的类型,而不需要调整虚拟表的位置。由于这个原因,它打印垃圾,因为它查看的字段偏移量是错误的。

理想情况下,您应该使用静态铸造,如

代码语言:javascript
运行
复制
out( static_cast<base2*>(o) );

但是,basebase2并没有通过继承直接相关,因此static_cast抛出了一个编译器错误。因此,您必须使用较慢的版本动态铸造作为

代码语言:javascript
运行
复制
out( dynamic_cast<base2*>(o) );

当你这样写的时候,程序会打印

代码语言:javascript
运行
复制
Program stdout
99

编译器资源管理器

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73431932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档