如果我不使用指针,会有什么区别?

时间:2018-07-25 18:44:36

标签: c++

我正在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:很抱歉,这个问题没有任何意义。

1 个答案:

答案 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 *。因为它是显式的,所以您将需要强制转换,否则转换(通常)将不会发生。通常,我认为您应该将其视为不匹配的概念。指针不是对象。他们指的是他们。进行模糊处理会使您的程序难以推理。