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

公有继承时为何不能用派生类名定义基类成员函数?

公有继承中为何不能用派生类类名定义基类成员函数?

这个问题其实戳中了很多人对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:25:15