C++虚继承场景下基类实例唯一性及歧义问题原理咨询
C++虚继承问题解答
问题对应代码示例
class X { public: int i; }; class Y : virtual public X {}; class Z : public Y, virtual public X { public: void f() { cout << i; } };
为什么当前场景下Z仅存在1份X实例,访问i无歧义
C++标准明确规定:对于最终派生类的完整继承树,所有通过虚继承路径指向同一个基类的声明,最终只会生成1份该基类的实例。当前场景中,Z到X的两条继承路径Z→Y→X、Z→X都属于虚继承,因此最终Z对象中只会保留1份X的实例,访问成员i时只有唯一的目标,自然不存在歧义。
为什么Z改为普通继承X会出现歧义
如果将Z对X的继承改为普通public X,那么Z的两条继承路径性质不同:
Z→Y→X是虚继承路径,对应1份虚基类X实例Z→X是普通非虚继承路径,会单独生成1份独立的X实例
此时Z对象中存在2个完全独立的X类实例,每个实例都有自己的成员i,编译器无法判断要访问哪个实例的i,因此会报访问歧义错误。
原有理解是否有误
原有理解是错误的。虚继承的作用范围是当前派生类的整个继承树,而非仅作用于后续从当前类派生的新类。只要在某个类的继承声明中指定了虚继承某个基类,该规则就会在这个类的对象构造时生效,合并所有同基类的虚继承路径的实例,不需要等到后续有类派生自它才生效。
内容的提问来源于stack exchange,提问作者askingRealQuestions
相关产品推荐
相关产品推荐

