公有继承时为何不能用派生类名定义基类成员函数?
公有继承中为何不能用派生类类名定义基类成员函数?
这个问题其实戳中了很多人对C++继承的误解——咱们先把本质说清楚,再拆解你的代码问题:
核心逻辑:成员函数的「归属权」和「访问权」是两码事
当你用public继承基类时,派生类获得的是基类公有成员的访问权限,但这些成员(包括函数)的「所有权」依然属于基类。打个比方:你继承了家里的车的使用权,但车的行驶证上还是你爸妈的名字,你不能拿着自己的身份证去给这辆车做年检——这和你用two::去定义one的函数是一个道理,编译器不认这种“张冠李戴”的操作。
你的代码错误分析
先看你给出的代码片段:
#include <iostream> using namespace std; class one{ int a; public: void get(int); void show(); }; class two:public one { int b; public: void getb(int); void dis(); }; // 错误写法:void two::get(int x) void one::get(int x) { a = x; } // 错误写法:void two::show() void one::show() { cout << a << endl; }
当你写void two::get(int x)时,编译器会理解为:你要定义派生类two自己的get成员函数,但你的two类声明里根本没有这个函数的原型,所以编译器会直接报错(类似'get' is not a member of 'two')。同时,基类one的get函数只声明没定义,后续如果调用的话也会触发链接错误。
正确的用法是什么?
如果你想让派生类对象调用基类的get和show,根本不需要修改函数的定义归属——直接用基类名定义,然后派生类对象正常调用就行:
int main() { two obj; obj.get(5); // 没问题,派生类继承了基类公有成员的访问权 obj.show(); return 0; }
如果你的需求是在派生类里重写基类的函数,那你需要先在two类里声明同名函数,再用two::定义它:
class two:public one { int b; public: void getb(int); void dis(); void get(int); // 先声明派生类自己的get函数 }; // 现在这样定义就合法了 void two::get(int x) { // 可以在这里调用基类的get:one::get(x); b = x * 2; }
内容的提问来源于stack exchange,提问作者Derek Frost
相关产品推荐
相关产品推荐

