多重继承来自多重继承
Multiple inheritance from multiple inheritance
#include<iostream>
using namespace std;
class base1{
public:
int x;
};
class base2{
public:
int x;
};
class derived1: public base1, public base2{
// Contains... base1::x, base2::x
};
class derived2: public base1, public base2{
// Contains... base1::x, base2::x
};
class derived: public derived1, public derived2{
};
如果我是对的,class derived
将包含四个整数。
但是我无法使用
访问它们
derived1::base1::x, derived1::base2::x, derived2::base1::x, derived2::base2::x
它显示歧义错误。 ('base1' is ambiguous base of 'derived')
我错过了什么吗?我该如何解决?
嗯,当您使用范围解析运算符来消除成员之间的歧义时,您不会为成员命名 "path"。您反而间接地命名了成员来自的基础class。
由于 class 名称被注入到 class 的范围内,因此,注入到从它派生的任何 class 的范围内,您只是命名base1
和 base2
以冗长的方式。 IE。以下所有内容对于成员访问都是等效的:
derived d;
d.base1::x;
d.derived1::base1::x;
d.derived1::derived1::base1::base1::x;
这就是歧义发生的原因。方法是将对象 cast 转换为 derived1&
或 derived2&
,然后通过 base1::x
和 [=17 使用成员访问=] 在那上面。
static_cast<derived1&>(d).base1::x;
#include<iostream>
using namespace std;
class base1{
public:
int x;
};
class base2{
public:
int x;
};
class derived1: public base1, public base2{
// Contains... base1::x, base2::x
};
class derived2: public base1, public base2{
// Contains... base1::x, base2::x
};
class derived: public derived1, public derived2{
};
如果我是对的,class derived
将包含四个整数。
但是我无法使用
访问它们
derived1::base1::x, derived1::base2::x, derived2::base1::x, derived2::base2::x
它显示歧义错误。 ('base1' is ambiguous base of 'derived')
我错过了什么吗?我该如何解决?
嗯,当您使用范围解析运算符来消除成员之间的歧义时,您不会为成员命名 "path"。您反而间接地命名了成员来自的基础class。
由于 class 名称被注入到 class 的范围内,因此,注入到从它派生的任何 class 的范围内,您只是命名base1
和 base2
以冗长的方式。 IE。以下所有内容对于成员访问都是等效的:
derived d;
d.base1::x;
d.derived1::base1::x;
d.derived1::derived1::base1::base1::x;
这就是歧义发生的原因。方法是将对象 cast 转换为 derived1&
或 derived2&
,然后通过 base1::x
和 [=17 使用成员访问=] 在那上面。
static_cast<derived1&>(d).base1::x;