$11.2/4 states-
A base class B of N is accessible at R, if
- an invented public member of B would be a public member of N, or
- R occurs in a member or friend of class N, and an invented public
member of B would be a private or
protected member of N, or
- R occurs in a member or friend of a class P derived from N, and an
invented public member of B would be a
private or protected member of P, or
- there exists a class S such that B is a base class of S accessible at R
and S is a base class of N accessible
at R."
Here 'B' is 'Base', 'N' is 'Derived' and 'R' is main.
Consider the 2nd bullet- 'R occurs in a member or friend of a class N,...'. This clause does not apply as 'R'(main) is neither a member nor friend of 'N'(Derived)
Consider the 3rd bullet- 'R occurs in a member or friend of a class P....'. This claus also does not apply for the same reasons as above
Consider the 4th bullet- Once again this clause does not apply
Thus we can conclude that 'Base' is not an accessible class of 'Derived'.
$11.2/5 states -
If a base class is
accessible, one can implicitly convert
a pointer to a derived class to a
pointer to that base class (4.10,
4.11). [ Note: it follows that members and friends of a class X can
implicitly convert an X* to a pointer
to a private or protected immediate
base class of X. —end note ]
Since Base
is not an accessible class of Derived
when accessed in main
, the Standard conversion from Derived class to Base class is ill-formed. Hence the error.
EDIT 2:
Study the error messages of some popular compilers and that should help you get a better understanding. Note how the word 'inaccessible' pops up so frequently and consistently across all the error messages
The references are from the draft standard N3000. I am yet to download the latest draft :)
GCC prog.cpp: In function ‘int
main()’: prog.cpp:27: error: ‘base’ is
an inaccessible base of ‘derived’
Comeau Online "ComeauTest.c", line 26:
error: conversion to inaccessible base
class "base" is not
allowed
ptr = new derived;
VS2010 error C2243: 'type cast' :
conversion from 'derived *' to 'base
*' exists, but is inaccessible