引用如何解决多重继承中的歧义

How do references resolve the ambiguity in multiple inheritance?

本文关键字:多重继承 歧义 解决 何解决 引用      更新时间:2023-10-16

以下代码显示了臭名昭著的钻石继承。但似乎适当的参考名称避免了歧义。

# 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的不同子对象。

此外,对D1D2的引用不知道它们在某些E内。引用可以引用内存中的任何对象,但它不知道该对象的周围环境。