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
相关产品推荐
相关产品推荐

