相关疑难解决方法(0)

在C++中使用'static_cast'进行向下转换

考虑:

class base
{
    base();
    virtual void func();
}

class derived : public base
{
    derived();
    void func();
    void func_d();
    int a;
}


main
{
    base *b = new base();
    sizeof(*b); // Gives 4.
    derived * d = static_cast<derived*>(b);
    sizeof(*d); // Gives 8- means whole derived obj size..why?
    d->func_d();
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我做了一个基指针的向下转换,它指向基对象到派生类指针.我想知道派生指针如何具有整个派生类对象.我可以调用派生类函数(仅在派生类中声明).我没有在这里得到这个概念.

c++

14
推荐指数
3
解决办法
2万
查看次数

两个相同类别的指针之间的铸造安全性?

假设我有两个不同的类,它们以相同的内部方式表示2D坐标数据,如下所示:

class LibA_Vertex{
    public:
    // ... constructors and various methods, operator overloads
    float x, y
};

class LibB_Vertex{
    public:
    // ... same usage and internal data as LibA, but with different methods
    float x, y
};


void foobar(){
    LibA_Vertex * verticesA = new LibA_Vertex[1000];
    verticesA[50].y = 9;
    LibB_Vertex * verticesB = reinterpret_cast<LibB_Vertex*>( vertexA );
    print(verticesB[50].y); // should output a "9"
};
Run Code Online (Sandbox Code Playgroud)

鉴于两个类是相同的并且上面的函数,我可以可靠地指望这个指针转换在每种情况下按预期工作吗?

(背景是,我需要一种简单的方法来交换具有相同Vertex类的两个独立库之间的顶点数组,我想避免不必要地复制数组).

c++ pointers casting

9
推荐指数
1
解决办法
513
查看次数

static_cast到base析构函数的指向派生类的安全性

这是使用C++中的Static_cast进行Downcasting的问题的变体,以及使用static_cast(或reinterpret_cast)进行无效向下转换的安全性,无需添加成员

我不清楚标准"B实际上是D类对象的子对象的短语,结果指针指向类型D的封闭对象"关于~B中的行为.如果你在~B中转换为D,那么它仍然是一个子对象吗?以下简单示例显示了以下问题:

void f(B* b);

class B {
public:
  B() {}
  ~B() { f(this); }
};

class D : public B { public: D() {} };

std::set<D*> ds;

void f(B* b) {
  D* d = static_cast<D*>(b);  // UB or subobject of type D?
  ds.erase(d);
}
Run Code Online (Sandbox Code Playgroud)

我知道演员是一个敞开大门的灾难,从dtor做这样的事情是一个坏主意,但同事声称"代码是有效的,并且工作正常.这个演员是完全有效的.评论明确指出它不应该被解除引用".

我指出演员阵容是不必要的,我们应该更喜欢类型系统提供的评论.令人遗憾的是,他是高级/首席开发人员之一,也是一位理想的c ++"专家".

我可以告诉他演员阵容是UB吗?

c++ casting static-cast language-lawyer

6
推荐指数
1
解决办法
1129
查看次数

向下转型和虚函数

我在采访中被问到这个问题,我不确定以下情况下的行为:

class A 
{ 
      virtual fun1(){...}
      virtual fun2(){...}
};

class B : public A
{ 
      virtual fun1(){...}
      virtual fun2(){...}
};
Run Code Online (Sandbox Code Playgroud)

现在如果,

A* AObj = new A;
B* BObj = (B*) AObj;
Run Code Online (Sandbox Code Playgroud)

是否BObj因为 virtual 关键字而可以访问 B 的方法,或者是否因为它指向 的对象而不能访问AObj

有人可以帮助我了解向下转型到底如何影响访问吗?

c++ polymorphism inheritance downcast

1
推荐指数
1
解决办法
1018
查看次数