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