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
相关产品推荐
相关产品推荐

