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
.