static_cast na wskaźnik klasy pochodnej

0

Cześć,
dlaczego rzutowanie w linii 20 jest możliwe i kompilator nie protestuje?

http://ideone.com/URLQZf

#include <iostream>
using namespace std;
 
 
class Base 
{
	public:
	virtual ~Base();
};
 
class Derived : public Base
{
	public:
     void implementation();
};
 
int main() {
	Base *base_ptr = nullptr;
 
	Derived *ptr = static_cast<Derived*>(base_ptr);
 
	return 0;
} 

Czytając dokumentację - http://en.cppreference.com/w/cpp/language/static_cast - to chyba nie powinno być możliwe.

4
  1. If new_type is a pointer or reference to some class D and the type of expression is a pointer or reference to its non-virtual base B, static_cast performs a downcast.

static_cast m.in. właśnie do tego służy. Mówisz kompilatorowi "ja wiem lepiej jaki to typ, na moją odpowiedzialność tak go traktuj".

0

Czy to się zmieniło z wejściem C++11/14, czy całe życie żyłem w błędnym przeświadczeniu, że tylko dynamic_cast tak może?

2

Byłeś w błędnym przeświadczeniu. dynamic_cast pozwala sprawdzić, czy to co robisz ma sens w trakcie działania programu¹ (t.j. czy typ pod referencją/wskaźnikiem jest zgodny z tym na który castujesz). static_cast robi to "na pałę", niezależnie czy faktycznie masz tam Derived czy TotallyDifferentDerived.

¹ Pozwala też na casty z virtual base.

0

Dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1