Why static cast do not allow upcasting for private inheritance | Sololearn: Learn to code for FREE!
New course! Every coder should learn Generative AI!
Try a free lesson
+ 1

Why static cast do not allow upcasting for private inheritance

Hi Refer code below: https://www.sololearn.com/compiler-playground/c130CUy32g3e Why static cast throws error? What is that static cast trying to prevent? In other words, C style casting allows but not static cast? What issue we will face if it was allowed to cast like we had in c style casting?

20th Oct 2022, 7:05 AM
Ketan Lalcheta
Ketan Lalcheta - avatar
2 Answers
+ 1
according to iso cpp ( https://isocpp.org/wiki/faq/private-inheritance#priv-inherit-like-compos ) "private inheritance is a syntactic variant of composition (AKA aggregation and/or has-a)" Meaning only the privately derived class (privateChannel in this case) would be knowing about the relation between the classes, making an attempt to cast ( both implicit cast and static_cast ) privately derived class pointer to base class outside the derived class illegal as it would be similar to casting pointer pointing to 2 different unrelated types. ( you can still perform the cast inside the privately derived class though, see this for example -> https://code.sololearn.com/cevFk481G11S/?ref=app ) This also explains why C-Style cast and reinterpret_cast <> still allows it as they allow you to cast to just about anything ( even if the pointer point to totally different types ) assuming that the developer knows what they are doing.
20th Oct 2022, 12:03 PM
Arsenic
Arsenic - avatar
0
I got your point that its kind of composition Arsenic But my query is like why so ? 1. Why private inheritance makes it like composition nd public inheritance dont makes it like compositon? 2. I get that reinterpret_cast is on unrelated types and doing so may result into undefined behaviour or failure or crash... so c style casting allowing it might result into failure when we access the pch casted from private channel... right ? Interested to know that scenario as below works fine with casting on private inheritance. What would have failed if we used c style cast to get base channel pointer ? Then it makes sense to stop this by static cast as compile time error is better than runtime error after c style casting https://code.sololearn.com/c3iFr32CuEt3/?ref=app
20th Oct 2022, 12:59 PM
Ketan Lalcheta
Ketan Lalcheta - avatar