我正在youtube上观看视频,如何使用C ++进行投射? 因为这是静态转换,所以我只想知道如果不使用指针会发生什么情况。
class Base{};
class Derived1: public Base {};
class Derived2: public Base{};
int main(){
Derived d1;
Derived d2;
Base *bp1=static_cast<Base*>(&d1);
Base *bp2=static_cast<Base*>(&d2);
Derived *d1p=static_cast<Derived1*>(bh2);
Derived *d2p=static_cast<Derived2*>(bp1);
return 0;
}
例如:
Base bp1=static_cast<Base*>(d1);
PS:很抱歉,这个问题没有任何意义。
答案 0 :(得分:2)
铸造指针(或引用)对基础对象没有任何作用,只是改变了您对给定地址处的内容(通过强制转换的指针进行查找)的方式。如果强制转换无效,那么您的代码当然是将具有未定义的行为。
没有指针,实际上是在修改对象。
Derived d1;
Base b = d1; // makes a copy of just the "Base" part of d1
上面的内容还可以,不需要强制转换,但这不是d1看起来像Base的视图。它是d1基本部分的分割副本。 “ b”是不相关的对象,仅由d初始化。这就是为什么它被称为“切片”的原因。
将对象投射到指针上是不明智的,除非您的类具有对该类型的转换运算符,尽管这通常是很糟糕的设计:
struct Derived : Base {
explicit operator Base*() { return this; } // don't really do this, but it compiles
};
给出这样一个奇怪的转换运算符,您的强制转换将起作用,并将其称为Derived :: operator Base *。因为它是显式的,所以您将需要强制转换,否则转换(通常)将不会发生。通常,我认为您应该将其视为不匹配的概念。指针不是对象。他们指的是他们。进行模糊处理会使您的程序难以推理。