引用如何解决多重继承中的歧义?
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 ( "%p\n", &c ) ;
printf ( "%p\n", &d ) ;
printf ( "%p\n", &e ) ;
printf ( "\n" ) ;
printf ("%p\n", (void*) &(c.m_a)) ;
printf ("%p\n", (void*) &(d.m_a)) ;
return 0 ;
}
输出为:
2
2
3
2
0xffffcbf0
0xffffcbf4
0xffffcbf0
0xffffcbf0
0xffffcbf4
所以似乎引用 'knows' 它应该在对象 'e' 的内存布局中开始,其中包含重复的 D1::m_a 和 D2::m_a 。我想知道它是如何在 C++ 实现中实现的。谢谢!
发现正在发生的事情的最简单方法是打印 (void*)(&c)
和 (void*)(&d)
。这两个引用引用了 e
.
的不同子对象
此外,对 D1
和 D2
的引用 而不是 知道它们在某些 E
中。引用可以引用内存中的任何对象,但它不知道该对象的周围环境。
下面的代码展示了臭名昭著的菱形继承。但似乎适当的参考名称避免了歧义。
# 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 ( "%p\n", &c ) ;
printf ( "%p\n", &d ) ;
printf ( "%p\n", &e ) ;
printf ( "\n" ) ;
printf ("%p\n", (void*) &(c.m_a)) ;
printf ("%p\n", (void*) &(d.m_a)) ;
return 0 ;
}
输出为:
2
2
3
2
0xffffcbf0
0xffffcbf4
0xffffcbf0
0xffffcbf0
0xffffcbf4
所以似乎引用 'knows' 它应该在对象 'e' 的内存布局中开始,其中包含重复的 D1::m_a 和 D2::m_a 。我想知道它是如何在 C++ 实现中实现的。谢谢!
发现正在发生的事情的最简单方法是打印 (void*)(&c)
和 (void*)(&d)
。这两个引用引用了 e
.
此外,对 D1
和 D2
的引用 而不是 知道它们在某些 E
中。引用可以引用内存中的任何对象,但它不知道该对象的周围环境。