在两种情况下,指向类的指针可转换为指向基类的指针。
备注
第一种情况是指定的基类可访问且转换是明确的。(有关不明确的基类引用的详细信息,请参阅多个基类。)
基类是否可访问取决于派生中使用的继承的类型。 考虑下图中阐释的继承。
阐明基类可访问性的继承关系图
下表显示针对该图阐释的情况的基类可访问性。
基类可访问性
函数的类型 |
派生 |
从 B* 到 A* 的转换是否合法? |
---|---|---|
外部(非类范围)函数 |
Private |
否 |
|
Protected |
否 |
|
Public |
是 |
B 成员函数(在 B 范围内) |
Private |
是 |
|
Protected |
是 |
|
Public |
是 |
C 成员函数(在 C 范围内) |
Private |
否 |
|
Protected |
是 |
|
Public |
是 |
第二种情况是,在您使用显式类型转换时,指向类的指针可转换为指向基类的指针。(有关显性类型转换的详细信息,请参阅使用显式类型转换的表达式。)
此类转换的结果是指向完全由基类描述的对象部分(即“子对象”)的指针。
以下代码定义了两个类(即 A 和 B),其中 B 派生自 A。(有关继承的详细信息,请参阅派生类。)然后定义 bObject、类型 B 的对象和两个指向该对象的指针(pA 和 pB)。
// 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
}
指针 pA 的类型为 A *,它可解释为“指向类型 A 的对象的指针”。bObject ( 的成员(如 BComponent 和 BMemberFunc)对类型 B 是唯一的,并且无法通过 pA 进行访问。 pA 指针只允许访问类 A 中定义的对象的那些特性(成员函数和数据)。