Angenommen, wir haben den folgenden Code:Sind diese Zeigerkonvertierungen mit static_cast ok?
#include <iostream>
struct A
{
virtual void f() {
std::cout << "A::f()" << std::endl;
}
};
struct B: A
{
void f() {
std::cout << "B::f()" << std::endl;
}
};
void to_A(void* voidp) {
A* aptr = static_cast<A*>(voidp);
aptr->f();
}
void to_B(void* voidp) {
B* bptr2 = static_cast<B*>(voidp);
bptr2->f();
}
int main() {
B* bptr = new B;
void* voidp = bptr;
to_A(voidp); // prints B::f()
to_B(voidp); // prints B::f()
}
diesen Code auf immer Arbeit wie in den Code-Kommentaren garantiert wird, oder es wird UB? AFAIK sollte es in Ordnung sein, aber ich möchte beruhigt sein.
EDIT
Ok, so scheint es, ein Konsens ist, dass dieser Code UB ist, wie man es nur auf den genauen Typ umwandeln kann. Also, was ist, wenn die main()
Änderungen:
int main() {
B* bptr = new B;
to_A(static_cast<A*>(bptr)); // still prints B::f()
to_B(bptr); // still prints B::f()
}
ist es immer noch UB?
mögliches Duplikat von [Wann sollten static_cast, dynamic_cast und reinterpret_cast verwendet werden?] (Http://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-and-reinterpret-cast-be -used) –
Der Code in EDIT kompiliert nicht ... Undefinierte Variable voidp. – Tomek
@Tomek-Code behoben. – Simone