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

C++中using继承基类构造函数时为何仅默认构造变为public?

问题现象解释

你观察到的结果是C++两条核心规则共同作用的结果,和using Base::Base的权限逻辑没有冲突:

1. 为什么d1可以正常构造

当派生类没有显式声明默认构造函数时,编译器会自动生成一个public的隐式默认构造函数Derive::Derive()。这个构造函数属于派生类的成员,有权限调用基类的protected默认构造函数Base(),所以你在main函数中调用public的派生类默认构造函数是合法的。
这里的d1完全没有用到using Base::Base继承来的构造函数:C++规定如果派生类已经存在和继承构造函数同签名的构造函数,继承来的同签名构造函数会被自动隐藏,所以基类的默认构造函数根本没有被继承到派生类的公开接口中。

2. 为什么d2无法构造

Derive本身没有声明带int参数的构造函数,所以using Base::Base确实会把基类的Base(int)继承为派生类的Derive(int)构造函数。
但基类的Base(int)本身是protected权限,继承来的构造函数会保留基类原有的访问权限,也就是说Derive(int)仍然是protected的,只能在Derive类内部或者Derive的子类中调用,你在类外的main函数调用这个protected构造函数属于非法访问,自然编译失败。

解决方案

如果要让带int参数的构造函数可以在类外调用,你需要显式声明派生类的对应构造函数,不能依赖继承构造函数的隐式权限调整:

struct Derive : public Base
{
public:
    Derive() = default;
    // 显式声明public的带参构造函数,调用基类构造函数
    Derive(int x) : Base(x) {}
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 19:57:02