Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6592129
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 25, 20262026-05-25T17:30:54+00:00 2026-05-25T17:30:54+00:00

Consider the following code: struct Base {}; struct Derived : public virtual Base {};

  • 0

Consider the following code:

struct Base {};
struct Derived : public virtual Base {};

void f()
{
    Base* b = new Derived;
    Derived* d = static_cast<Derived*>(b);
}

This is prohibited by the standard ([n3290: 5.2.9/2]) so the code does not compile, because Derived virtually inherits from Base. Removing the virtual from the inheritance makes the code valid.

What’s the technical reason for this rule to exist?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-25T17:30:54+00:00Added an answer on May 25, 2026 at 5:30 pm

    The technical problem is that there’s no way to work out from a Base* what the offset is between the start of the Base sub-object and the start of the Derived object.

    In your example it appears OK, because there’s only one class in sight with a Base base, and so it appears irrelevant that the inheritance is virtual. But the compiler doesn’t know whether someone defined another class Derived2 : public virtual Base, public Derived {}, and is casting a Base* pointing at the Base subobject of that. In general[*], the offset between the Base subobject and the Derived subobject within Derived2 might not be the same as the offset between the Base subobject and the complete Derived object of an object whose most-derived type is Derived, precisely because Base is virtually inherited.

    So there’s no way to know the dynamic type of the complete object, and different offsets between the pointer you’ve given the cast, and the required result, depending what that dynamic type is. Hence the cast is impossible.

    Your Base has no virtual functions and hence no RTTI, so there certainly is no way to tell the type of the complete object. The cast is still banned even if Base does have RTTI (I don’t immediately know why), but I guess without checking that a dynamic_cast is possible in that case.

    [*] by which I mean, if this example doesn’t prove the point then keep adding more virtual inheritance until you find a case where the offsets are different 😉

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

Consider the following code: #include <iostream> struct foo { // (a): void bar() {
Consider the following code: struct Foo { mutable int m; template<int Foo::* member> void
Consider the following code: #include<iostream> #include<utility> struct Base { int baseint; }; struct Der1
consider the following code:- struct mystruct { int data; struct mystruct *next; }; void
Consider the following code: struct Vec2 : IEquatable<Vec2> { double X,Y; public bool Equals(Vec2
Consider the following code: #include <iostream> struct X{ X(){ throw 0; } }; void
Consider a following code: struct X { void MethodX() { ... } }; struct
Consider the following code: struct Calc { Calc(const Arg1 & arg1, const Arg2 &
Consider the following code: template <int dim> struct vec { vec normalize(); }; template
Please consider the following code, struct foo { foo() { std::cout << Constructing! <<

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.