There are two cases in which a pointer to a class can be converted to a pointer to a base class.
The first case is when the specified base class is accessible and the conversion is unambiguous. (See “Multiple Base Classes” in Chapter 9, on topic for more information about ambiguous base-class references.)
Whether a base class is accessible depends on the kind of inheritance used in derivation. Consider the inheritance situation illustrated in Figure 3.1.
Table 3.2 shows the base-class accessibility for the situation illustrated in Figure 3.1.
Table 3.2 Base-Class Accessibility
Type of Function | Derivation | Conversion from B* to A* Legal? |
External (not class-scoped) function | Private | No |
Protected | No | |
Public | Yes | |
B member function (in B scope) | Private | Yes |
Protected | Yes | |
Public | Yes | |
C member function (in C scope) | Private | No |
Protected | Yes | |
Public | Yes |
The second case in which a pointer to a class can be converted to a pointer to a base class is when you use an explicit type conversion. (See “Expressions with Explicit Type Conversions” in Chapter 4, on topic for more information about explicit type conversions.
The result of such a conversion is a pointer to the “subobject,” the portion of the object that is completely described by the base class.
The following code defines two classes, A and B, where B is derived from A. (For more information on inheritance, see Chapter 9, “Derived Classes.”) It then defines bObject, an object of type B, and two pointers (pA and pB) that point to the object.
class A
{
public:
int AComponent;
int AMemberFunc();
};
class B : public A
{
public:
int BComponent;
int BMemberFunc();
};
B bObject;
A *pA = &bObject;
B *pB = &bObject;
pA->AMemberFunc(); // OK in class A
pB->AMemberFunc(); // OK: inherited from class A
pA->BMemberFunc(); // Error: not in class A
The pointer pA is of type A *, which can be interpreted as meaning “pointer to an object of type A.” Members of bObject (such as BComponent and BMemberFunc) are unique to type B and are therefore inaccessible through pA. The pA pointer allows access only to those characteristics (member functions and data) of the object that are defined in class A.