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

C++菱形继承下using声明的B::attack为私有无法从main调用如何解决

问题原因
  • using 声明引入的基类成员的访问权限,完全由该声明所在的类的访问控制区域决定,和基类中该成员的原始访问权限无关,并非using关键字会默认将引入的成员设为私有。
  • C++中class定义的类的默认访问权限为私有,你将using B::attack;写在了D类的最开头,没有进入public修饰的区域,所以这条声明属于D类的私有范围,引入的attack成员自然成为了D的私有成员,类外的main函数无法访问。
  • 该报错和你用到的虚继承机制无关,属于访问控制位置使用错误,修改后不会影响虚继承保证D仅生成一份A类实例的特性。
解决方案

将using B::attack;移动到D类的public访问控制块下即可,该方案完全符合C++98标准,也不需要用到friend关键字:

class D : public B, public C
{
    public:
        using   B::attack; // 放在public区域后,引入的attack为D的公有成员

        D(void);
        D(std::string &name);
        D(D &instance);
        ~D(void);

        D&      operator=(D &instance);

};

修改后,D类实例调用attack时会直接匹配你引入的B类attack成员,不会产生二义性报错,同时该成员为公有权限,类外可以正常调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:06:01