指向类的指针

在两种情况下,指向类的指针可转换为指向基类的指针。

备注

第一种情况是指定的基类可访问且转换是明确的。(有关不明确的基类引用的详细信息,请参阅多个基类。)

基类是否可访问取决于派生中使用的继承的类型。 考虑下图中阐释的继承。

阐明基类可访问性的继承关系图

显示基类的可访问性的继承图

下表显示针对该图阐释的情况的基类可访问性。

基类可访问性

函数的类型

派生

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 中定义的对象的那些特性(成员函数和数据)。

请参见

参考

指针转换 (C++)