C++抽象类实例程序报错咨询:对象调用与权限疑问解析
你的C++程序问题详解
先帮你梳理代码里的核心坑点,再逐个解答你的疑问:
先拆解代码里的关键错误
你的main函数里藏了几个容易混淆的C++语法陷阱:
Z z2();这不是创建Z类型对象,而是声明了一个名为z2、返回Z类型、无参数的函数!所以后面的z2.h()会报错,本质是你试图给一个函数调用成员方法,完全不合法。X* x1;这是个未初始化的野指针,它没有指向任何有效的X或Z对象,调用x1->f(cout)属于未定义行为——程序可能崩溃、输出乱码,甚至看起来“正常运行”,但这绝对是错误写法。z.h()报错和对象有效性无关,纯粹是因为h()是Z类的私有成员,外部代码(比如main函数)无权访问类的私有成员。
逐个解答你的疑问
1. 关于cout << z << endl;和z2的判断
你的判断存在误解:
cout << z << endl;是可以正常执行的!z是通过Z z;正确构造的Z对象,不是什么“假想对象”。这段代码会调用你重载的operator<<,进而触发z.f(flot),最终输出Z::f。- 真正有问题的是
z2,它根本不是对象,而是函数声明,和“已构造的真实对象”完全不沾边——z2从语法上就不是对象实例。
2. 为什么x1->f(cout)和z.h()存在问题?
x1->f(cout)的问题:x1是野指针,没有指向有效对象。虽然C++语法允许通过指针调用非静态成员函数(因为成员函数的调用地址是编译期确定的,不依赖对象存在),但这属于未定义行为。你的f函数刚好没有访问对象的成员变量(比如X类的a),所以可能不会立刻崩溃,但这绝对是错误的,必须让x1指向一个有效对象,比如X* x1 = new Z();或者Z z_obj; X* x1 = &z_obj;。z.h()的问题:和z是不是有效对象无关,就是私有成员的访问权限问题——类的私有成员只能在类内部或友元中调用,外部代码(main函数)没有权限。
3. 若h改为公有,z.h()为何能调用?
因为z是完全合法、正确构造的Z对象!你之前误解了z的状态,z通过Z z;完成了正常的构造流程,只要成员函数是公有的,外部代码自然可以通过这个合法对象调用它。而你说的“假想对象”其实是z2,但z2是函数声明,哪怕h改成公有,z2.h()依然会报错。
给你一个修正后的main函数参考:
int main() { Z z; cout << z << endl; // 正常输出Z::f Z z2; // 正确创建对象,而非函数声明 Z z_obj; X* x1 = &z_obj; // 让指针指向有效对象 x1->f(cout); // 正常输出Z::f // z.h(); 若h改为公有,此句可正常执行 }
内容的提问来源于stack exchange,提问作者Marine Galantin
相关产品推荐
相关产品推荐

