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

能否通过Rectangle派生类调用Shape基类构造函数初始化其私有成员?

派生类调用基类构造函数初始化基类私有成员的可行方案

完全不需要把width和height改成protected!你可以通过派生类构造函数的初始化列表调用基类的构造函数,让基类自己来完成私有成员的初始化——这既符合封装原则,又能完美实现你的需求。

下面结合你提到的文件结构,给出具体的代码实现:

1. Shape.h(基类定义)

在基类中定义私有成员,并提供一个带参数的构造函数,用来初始化这些私有成员:

#ifndef SHAPE_H
#define SHAPE_H

class Shape {
private:
    int width;
    int height;
public:
    // 基类带参构造函数,负责初始化私有成员
    Shape(int w, int h) : width(w), height(h) {}
};

#endif

2. Rectangle.h(派生类定义)

派生类继承Shape后,在自己的构造函数初始化列表中调用基类的带参构造函数,传递需要的参数:

#ifndef RECTANGLE_H
#define RECTANGLE_H
#include "Shape.h"

class Rectangle : public Shape {
public:
    // 派生类构造函数,初始化列表中调用基类构造函数
    Rectangle(int w, int h) : Shape(w, h) {}
};

#endif

3. Main.cpp(使用示例)

创建Rectangle对象时,传入的参数会通过派生类构造函数传递给基类构造函数,完成width和height的初始化:

#include "Rectangle.h"

int main() {
    // rec对象会自动触发基类构造函数,初始化Shape的私有成员
    Rectangle rec(10, 20);
    return 0;
}

关键原理说明

基类的私有成员虽然无法被派生类直接访问,但基类自身的构造函数拥有访问权限。派生类只需要在初始化阶段调用基类的构造函数,把初始化参数传递过去,剩下的私有成员初始化工作就由基类自己完成了。

这种方式比把成员改成protected更好——保持私有成员的封装性,让基类自己管理内部状态,派生类只需要关注自身的逻辑,完全符合面向对象的设计原则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:34:59