C++ 是什么使上投和下投违法

C++ 是什么使上投和下投违法,c++,downcast,C++,Downcast,在讲座中,一些学生说这种上下转换缺乏逻辑,是非法的。有人问老师是怎么弄糊涂的,同意了,说他会复习,然后再讲课,但我不知道这段代码有什么问题,有没有违法的情况 #include <iostream> using namespace std; class base { public: int a,b; base(){ a=0; b=1;} }; class derived : public base { public:

在讲座中,一些学生说这种上下转换缺乏逻辑,是非法的。有人问老师是怎么弄糊涂的,同意了,说他会复习,然后再讲课,但我不知道这段代码有什么问题,有没有违法的情况

#include <iostream>
using namespace std;
class base {
public:
        int a,b;
        base(){
        a=0;
        b=1;}
};
class derived : public base {
public:
    int c,d;
    derived(){
    c=2;
    d=3;
    }
};
int main(){
    derived der;
    base baseob;
    derived *derptr=new derived;
    derptr=(derived*)&baseob;
    base *baseptr=new base;
    baseptr=&der;
}

如果向下转换,则必须确保正在转换的对象的运行时类型确实是目标类型。当您将指向
baseob
的指针强制转换为指向
derived
的指针时,您违反了类型系统,因为现在指向
derived
的指针没有指向
derived

如果您向下转换,则必须确保正在强制转换的对象的运行时类型确实是目标类型。当您将指向
baseob
的指针强制转换为指向
derived
的指针时,您破坏了类型系统,因为现在您有一个指向
derived
的指针,该指针不指向
derived

,无论内存是否泄漏,这都不是推荐的强制转换方法。提供的示例使用C样式转换,尽管它们可以工作,但很容易导致未定义的行为(如果类型层次结构不匹配)

通过
baseptr=&der很好,但更常见的调用是:

base* baseptr = new derived();
如果创建的对象是派生类,则此操作始终有效

向下广播应通过
动态广播执行,例如:

base* baseptr = new base();
derived* derptr = dynamic_cast<derived>(baseptr); // will fail, derptr == nullptr
base*baseptr=newbase();
派生*derptr=dynamic_cast(baseptr);//将失败,derptr==nullptr

如果无法将指针强制转换到派生类(相对于基类而言是真正扩展的)中,
dynamic_cast
将返回null ptr。你应该检查一下。在上面的示例中,强制转换将失败,
derptr==nullptr
解析为
true

,无论内存是否泄漏,这都不是推荐的强制转换方法。提供的示例使用C样式转换,尽管它们可以工作,但很容易导致未定义的行为(如果类型层次结构不匹配)

通过
baseptr=&der很好,但更常见的调用是:

base* baseptr = new derived();
如果创建的对象是派生类,则此操作始终有效

向下广播应通过
动态广播执行,例如:

base* baseptr = new base();
derived* derptr = dynamic_cast<derived>(baseptr); // will fail, derptr == nullptr
base*baseptr=newbase();
派生*derptr=dynamic_cast(baseptr);//将失败,derptr==nullptr

如果无法将指针强制转换到派生类(相对于基类而言是真正扩展的)中,
dynamic_cast
将返回null ptr。你应该检查一下。在上面的示例中,强制转换将失败,并且
derptr==nullptr
解析为
true

内存泄漏,因为您通过调用
new
获得内存,但对于空闲指针,您不调用
delete
。此外,将指针设置为本地对象后,指针丢失:
derptr=(派生*)&baseob
baseptr=&der。这是非常错误的!无论在这里向上还是向下。您应该阅读C++中的
new
delete
指针
只有一个强制转换,即downcast
(派生*)&baseob
,这是非法的,因为
baseob
不是
派生的
<代码> BasePtRe= & De/Cord>是有效的,但不是一个Case.@ MulbDNILO,它不是C++定义的“Casic”,而是一个隐式上流,即使不是正式的C++术语,它也是常用的术语。@萨阿德请使用一个帮助,并通过格式化使代码示例可读!内存泄漏,因为您通过调用
new
获取内存,但没有调用
delete
获取空闲指针。此外,将指针设置为本地对象后,指针丢失:
derptr=(派生*)&baseob
baseptr=&der。这是非常错误的!无论在这里向上还是向下。您应该阅读C++中的
new
delete
指针
只有一个强制转换,即downcast
(派生*)&baseob
,这是非法的,因为
baseob
不是
派生的
<代码> BasePtRe= & De/Cord>是有效的,但不是一个Case.@ MulbDNILO,它不是C++定义的“Casic”,而是一个隐式上流,即使不是正式的C++术语,它也是常用的术语。@萨阿德请使用一个帮助,并通过格式化使代码示例可读!dynamic_cast的问题是,基类需要至少有一个虚函数,而OPs示例则不是这样,并且必须激活RTTI。请参阅编译器文档以了解如何使用。动态_cast的问题是,基类至少需要一个虚拟函数,而OPs示例并非如此。必须激活RTTI。请参阅编译器文档以了解如何使用。
base* baseptr = new base();
derived* derptr = dynamic_cast<derived>(baseptr); // will fail, derptr == nullptr