/ / Доступ до неоднозначного члена класу - c ++

Доступ до неоднозначного члена класу - c ++

У мене є діамант. Я хочу отримати доступ до учня. Я використовую мінув.
Питання є: Як отримати доступ до члена "top :: A" без перевизначення класів

#include <cstdio>
class top {
public:
const char A;
top(): A("t") {}
};
class left: public top {
public:
const char A;
left():A("l"){}
};
class right: public top {};
class bottom: public left, public right {};

int main() {
bottom obj;
printf("%cn", obj.bottom::right::A); //using right::A, inherited from top::A
printf("%cn", obj.bottom::left::A); //using left::A and left::top::A is hidden
//printf("%cn", obj.bottom::left::top::A); //error. How to access it?
return 0;
}

Коли я видалю коментар, мінв дає мені помилку:

"top" is an ambiguous base of "bottom"

Оновлення: Схоже, працює типи лиття:

printf("%cn", static_cast<top>(static_cast<left>(obj)).A);
printf("%cn", static_cast<left>(obj).::top::A);
printf("%cn", reinterpret_cast<top&>(obj).A);//considered bad
printf("%cn", (reinterpret_cast<top*>(&obj))->A);//considered evil
//      printf("%cn", static_cast<top&>(obj).A);//error

Відповіді:

4 для відповіді № 1

Не підключаючись до віртуальної спадщини, ви можете масажувати тип трохи, щоб переконати компілятора вибрати правильний базовий клас:

printf("%cn", static_cast<left&>(obj).::top::A);

2 для відповіді № 2

Я не зовсім гуру С ++, але не можу виконати наступну роботу?

left &asLeft = obj ;
top &asTop = asLeft ;
cout << asTop.A << endl ;

-1 для відповіді № 3

Демонд проблема. Подивитися http://en.wikipedia.org/wiki/Diamond_problem