引用如何解决多重继承中的歧义
How do references resolve the ambiguity in multiple inheritance?
以下代码显示了臭名昭著的钻石继承。但似乎适当的参考名称避免了歧义。
# include <iostream>
# include <stdio.h>
class B {
public:
int m_a ;
} ;
class D1 : public B { } ;
class D2 : public B { } ;
class E : public D1, public D2 { } ;
int main () {
E e ;
D1& c = e ;
D2& d = e ;
e.D1::m_a = 2 ;
e.D2::m_a = 2 ;
std::cout << c.m_a << std::endl ;
std::cout << d.m_a << std::endl ;
c.m_a = 3 ;
std::cout << c.m_a << std::endl ;
std::cout << d.m_a << std::endl ;
printf ( "%pn", &c ) ;
printf ( "%pn", &d ) ;
printf ( "%pn", &e ) ;
printf ( "n" ) ;
printf ("%pn", (void*) &(c.m_a)) ;
printf ("%pn", (void*) &(d.m_a)) ;
return 0 ;
}
输出为:
2
2
3
2
0xffffcbf0
0xffffcbf4
0xffffcbf0
0xffffcbf0
0xffffcbf4
因此,引用似乎"知道"它应该在对象"e"的内存布局中从哪里开始,其中包含重复的 D1::m_a 和 D2::m_a 。我想知道它是如何在C++实施中实现的。谢谢!
发现正在发生的事情的最简单方法是打印(void*)(&c)
并(void*)(&d)
。这两个引用指的是e
的不同子对象。
此外,对D1
和D2
的引用不知道它们在某些E
内。引用可以引用内存中的任何对象,但它不知道该对象的周围环境。
相关文章:
- 关于C++中具有多重继承"this"指针的说明
- C++中模板化异常类的多重继承
- 虚拟继承中是否存在多重继承?
- 如何在 c++ 多重继承中调用父非虚函数?
- 多重继承相同的方法名,没有歧义
- 使用enable_if解决多重继承歧义
- 多重继承导致虚假的模糊虚拟函数过载
- 多重继承和访问不明确的元素
- C++ 多重继承:使用基类 A 的实现实现基类 B 的抽象方法
- 多重继承中的派生类的行为类似于聚合
- 为什么我的 Hippomock 期望在使用多重继承时失败
- 引用如何解决多重继承中的歧义
- 如何处理同一模板多重继承中的歧义
- 消除多重继承中类成员的歧义
- 与 [] 运算符和多重继承的歧义
- 关于多重继承和歧义
- C++多重继承+虚拟函数(-歧义)=怪异行为(也是函数指针)
- 多重虚拟继承歧义
- c++多重继承有歧义
- 多重继承歧义基类