Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在动态强制转换c+方面有问题+;_C++ - Fatal编程技术网

C++ 在动态强制转换c+方面有问题+;

C++ 在动态强制转换c+方面有问题+;,c++,C++,我试图编写一个简单的程序,作为在基类对象和派生类对象之间来回转换的演示。这是我的密码 #include "stdafx.h" #include <iostream> using namespace std; class a { virtual void hi(){} }; class b : public a { }; int main() { a abs = b(); b& bbs = dynamic_cast<b&>(a

我试图编写一个简单的程序,作为在基类对象和派生类对象之间来回转换的演示。这是我的密码

#include "stdafx.h"
#include <iostream>

using namespace std;

class a
{
    virtual void hi(){}
};

class b : public a
{
};

int main()
{
    a abs = b();
    b& bbs = dynamic_cast<b&>(abs);
    while(true);
}
#包括“stdafx.h”
#包括
使用名称空间std;
甲级
{
虚拟void hi(){}
};
b类:公共a
{
};
int main()
{
a abs=b();
b&bbs=动态铸造(abs);
虽然(正确);
}

<代码>编译好,但是当我运行它时,我在类Test.Exe中的“0x75 C4C41F”中得到了一个“未处理的异常:微软C++异常:STD::BADYCAST在内存位置0x03DF908。”我不知道我做错了什么。有人能给我解释一下为什么这不起作用。

你不能动态投射对象。只能强制转换引用或指针

换成

a* abs = new b();
b* bbs = dynamic_cast<b*>(abs);
a*abs=newb();
b*bbs=动态抛投(abs);

obj_b=b();
a&abs=obj_b;
b&bbs=动态铸造(abs);

您的代码有错误
abs
是类型为
a
的对象,是从
b
的匿名实例复制而成的。您需要的是a
b
的实例,并将
abs
作为对
a
的引用

b bbs;
a &abs = bbs;
b &bbr = dynamic_cast<b&>(abs);
bbs;
a&abs=bbs;
b&bbr=动态铸造(abs);

你应该有一个虚拟析构函数,在<代码> A<代码>中,因为你想使用多态性(尽管这个例子不需要)。

< p>你遇到了一个C++问题,叫做“切片”。基本上,
abs
是一个
a
,而不是一个
b
,因为

a abs = b();
  • 创建一个新的
    b
    对象
  • 查找采用
    b
    a
    构造函数,并查找
    a
    的副本构造函数(基于从
    b
    a
    的隐式转换)
  • 将新的
    b
    对象转换为
    a
    (通过丢弃特定于
    b
    的零件),并将其传递给
    a
    的复制构造函数
  • 如果您需要以多态方式复制对象(这可能是您在实际代码中实际需要的,也可能不是),典型的方法是这样做:

    class a
    {
    public:
        virtual a *clone() { return new a(*this); }
    };
    
    class b
    {
        virtual a *clone() { return new b(*this); }
    };
    
    b my_b;
    a *abs = my_b.clone();
    

    同样,不确定这是否是您在本例中所需要的,但它确实存在。

    类似的内容可能就是您试图做的:

    #include <iostream>
    
    class a
    {
        public:
            virtual void hi(){}
            virtual ~a() {}
    };
    
    class b : public a
    {
    };
    
    int main()
    {
        b b_obj;
        a& a_ref_to_b = b_obj;
        b& b_ref_to_b = dynamic_cast<b&>(a_ref_to_b);
        return 0;
    }
    
    #包括
    甲级
    {
    公众:
    虚拟void hi(){}
    虚拟~a(){}
    };
    b类:公共a
    {
    };
    int main()
    {
    b_obj;
    a&a参考至b=b;
    b&b_-ref_-to_-b=动态演员阵容(a_-ref_-to_-b);
    返回0;
    }
    
    abs
    a
    ,而不是
    b
    。因此,您不能将其动态转换为任何其他内容;如果你坚持这条规则,这样的废话就永远不会被编译。你遇到了切片问题…关于:“在基类对象和派生类对象之间来回转换”-代码不会在对象类型之间转换;它将引用强制转换为对象。别把这两个人搞混了;如果你这样做了,差异会在以后影响你。这要看情况而定。只要确保这不会是一场灾难
    #include <iostream>
    
    class a
    {
        public:
            virtual void hi(){}
            virtual ~a() {}
    };
    
    class b : public a
    {
    };
    
    int main()
    {
        b b_obj;
        a& a_ref_to_b = b_obj;
        b& b_ref_to_b = dynamic_cast<b&>(a_ref_to_b);
        return 0;
    }