You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中如何定义指向MAX大小类指针数组的指针并访问成员函数

正确定义指向类指针数组的指针的方式

首先明确你遇到的编译错误原因:base* arr[MAX]是一个存储base*的数组,数组名arr在表达式中会隐式转换为指向数组第一个元素的指针,类型是base**;而你定义的base *(*pArr)[MAX]是指向整个base*数组的指针,这两个类型不兼容,直接赋值自然会报错。

方式1:使用指向整个数组的指针(严格类型匹配)

要正确使用base *(*pArr)[MAX]这种指针,你需要取数组的地址(&arr)来赋值,因为&arr的类型正好是base* (*)[MAX]。访问数组元素时,需要先解引用指针得到整个数组,再通过下标访问。

修正后的完整代码:

#include <iostream>
using namespace std;

const int MAX = 3;

class base
{
public :
    base() {cout << "base class constructor" << endl;}
    virtual void g() {cout << "base :: g()" << endl;}
};

class derived_1 : public base
{
public :
    derived_1() : base() {cout << "derived_1 class constructor" << endl;}
    virtual void g() {cout << "derived_1 :: g()" << endl;}
};

class derived_2 : public derived_1
{
public :
    derived_2() : derived_1() { cout << "derived_2 class constructor" << endl;}
    // 注意:这里的g(int)是重载,并非重写base的无参g()
    // 若要让base*指针调用derived_2的版本,需重写无参g():
    // void g() override {cout << "derived_2 :: g()" << endl;}
    void g(int) {cout << "derived_2 :: g(int)" << endl;}
};

int main()
{
    int i;
    base b;
    derived_1 d_1;
    derived_2 d_2;

    base* arr[MAX] = {&b, &d_1, &d_2};
    // 定义指向base*数组的指针
    base *(*pArr)[MAX];
    // 赋值:取数组的地址,类型完全匹配
    pArr = &arr;

    for (i=0 ; i < MAX ; i++)
    {
        // 先解引用pArr得到数组,再通过下标访问元素
        (*pArr)[i]->g();
    }

    return 0;
}

方式2:使用指向指针的指针(灵活通用)

你临时用的base** pArr属于指向base*的指针,它可以指向任何base*的连续序列(包括固定大小数组、动态分配的指针数组),这种写法并非临时方案,而是C++中处理指针序列的常用方式,灵活性更高,但会丢失数组的大小信息(需要手动维护长度)。

两种方式的对比

  • 指向数组的指针(base* (*)[MAX]):类型严格绑定数组大小,能避免误指向其他长度的数组,适合固定长度的数组场景;
  • 指向指针的指针(base**):无长度限制,可适配任意长度的base*序列,适合动态数组或需要传递不同长度指针序列的场景。

另外补充:你的derived_2类中定义的g(int)是重载而非重写基类的g(),所以通过base*指针调用g()时,会执行基类的g()。如果需要让derived_2的版本被多态调用,需要定义签名一致的void g() override。

内容的提问来源于stack exchange,提问作者KuSa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 01:57:38