Pointers to Classes
There are two cases in which a pointer to a class can be converted to a pointer to a base class.
Remarks
The first case is when the specified base class is accessible and the conversion is unambiguous. (See Multiple Base Classes 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 illustrated in the following figure.
Inheritance Graph for Illustration of Base-Class Accessibility
The following table shows the base-class accessibility for the situation illustrated in the figure.
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 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 Derived Classes.) It then defines bObject, an object of type B, and two pointers (pA and pB) that point to the object.
// conve__pluslang_Pointers_to_Classes.cpp
// C2039 expected
class A
{
public:
int AComponent;
int AMemberFunc();
};
class B : public A
{
public:
int BComponent;
int BMemberFunc();
};
int main()
{
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.