2016-08-29 12 views
-2
Please have a look at the code: 
#include <iostream> 
using namespace std; 

class base1 
{ 
public: 
    int x,y; 
}; 
    class base2 
{ 
public: 
    int x, z; 
}; 

class derived: virtual public base1,virtual public base2 
{ 
    public: 
    void display(int a, int b, int c) 
    { 
     x=a; 
     y=b; 
     z=c; 
     cout<<x<<endl<<y<<endl<<z<,endl; 

    } 
}; 

int main() 
{ 
    derived dr; 
    dr.display(1,2,3); 
} 

Поскольку базовые классы base1 и base2 сделаны виртуальными, он должен решить проблему объявления x в этих классах. Но это не так. Это дает мне ошибку: ошибка: ссылка на 'х' неоднозначна Может ли кто-нибудь поставить свет?Невозможно избавиться от проблемы Diamond в C++

+1

A) У вас нет алмазов. B) как компилятор должен знать, какой 'x' вы хотите? Вы знаете, какой 'x' вы хотите изменить? – NathanOliver

+0

Виртуальное наследование не «объединяет» членов, оно «объединяет» подобъекты базового класса. – aschepler

+0

Да, это не проблема с алмазом. согласовано. Я хочу изменить x из базового класса 1. – coder999

ответ

1

Это не проблема алмазов наследования , У вас есть:

base1 base2 
^ ^
|  | 
\ /
    \ /
    \/
    \/ 
derived 

Проблема заключается в том, что оба base1 и base2 есть член x.

Вы должны неоднозначность x от derived использования base1:: или base2::, даже если у вас нет бриллиантового наследства.

Игнорируя на время обоснования для изменения значений переменных-членов в derived::display, вы можете использовать:

class derived: virtual public base1,virtual public base2 
{ 
    public: 
     void display(int a, int b, int c) 
     { 
     base1::x=a; 
     y=b; 
     z=c; 
     cout<<base1::x<<endl<<y<<endl<<z<<endl; 
     } 
}; 
-1

Вместо ссылок на туманную x, y и z переменных, используйте base1.x или base2.x. Например:

ИЗМЕНЕНИЯ

x=a; 
    y=b; 
    z=c; 
    cout<<x<<endl<<y<<endl<<z<<endl; 

К

base1 b1; 
    base2 b2; 
    b1.x=a; 
    b2.x=a; 
    b1.y=b; 
    b2.z=c; 
    cout<<b2.x<<endl<<b1.y<<endl<<b2.z<,endl; 

ИЛИ: (если вы хотите изменить this значения)

base1::x=a; 
    base2::x=a; 
    base1::y=b; 
    base2::z=c; 
    cout<<base2::x<<endl<<base1::y<<endl<<base2::z<,endl; 
+0

OP предположительно хочет изменить членов 'this', а не членов локальных объектов. – aschepler

+0

Спасибо всем, кто прокомментировал! – coder999