考虑:
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)
在上面的代码中,我做了一个基指针的向下转换,它指向基对象到派生类指针.我想知道派生指针如何具有整个派生类对象.我可以调用派生类函数(仅在派生类中声明).我没有在这里得到这个概念.
假设我有两个不同的类,它们以相同的内部方式表示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++中的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吗?
我在采访中被问到这个问题,我不确定以下情况下的行为:
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?
有人可以帮助我了解向下转型到底如何影响访问吗?