2012-05-04 7 views
1

Пожалуйста, не ставьте под сомнение истинную нечетную иерархию работников в этом коде, я понятия не имею, почему кто-то захочет что-то вроде этого, но я решил сделать упражнение в множественном наследовании, чтобы быть уверенным Я полностью это понял. Итак, вот результат.C++ множественное наследование

using namespace std; 

class Employee 
{ 
protected: 
    string name; 
public: 
    string getname() 
    { 
     return name; 
    } 
    void setname(string name2) 
    { 
     name = name2; 
    } 
    Employee(string name2) 
    { 
     name = name2; 
    } 
    Employee(){} 
}; 

class Manager : public Employee 
{ 
public: 
    string getname() 
    { 
     return ("Manager" + name); 
    } 
    Manager(string name2) : Employee(name2){} 
    Manager() : Employee(){} 
}; 

class Supervisor : public Manager,public Employee 
{ 
public: 
    Supervisor(string name2) : Manager(name2) , Employee(name2){} 
    Supervisor() : Manager() , Employee(){} 
    string getname() 
    { 
     return ("Supervisor" + Employee::getname()); 
    } 
}; 

Надеюсь, вы понимаете, что я пытаюсь сделать здесь. Я получаю кое-что о «неоднозначном преобразовании между производным классом« Супервизор »и ​​базовым классом« Сотрудник ».« Так что мне делать?

+1

«Надеюсь, вы понять, что я пытаюсь сделать здесь.» Возможно, вам будет лучше объяснять, что вы пытаетесь сделать. – thiton

+0

Почему супервизор наследуется от менеджера? –

+0

@Justin: Более уместный вопрос, так как 'Manager' наследует от' Employee', почему 'Supervisor' наследует от' Employee', а не просто 'Manager'? – ildjarn

ответ

6

На самом деле, как вы определили класс Supervisor, его объект будет иметь два предмета типа Employee, каждый из которых будет из него базовыми классами. Это вызывает проблемы.

Решения использовать virtual inheritance (при условии, что вам нужно множественное наследование), как:

class Manager : public virtual Employee 

Надеется, что вы обратите внимание на virtual ключевое слово здесь. :-)

+0

Конечно, вы должны использовать только виртуальное наследование, если вы не можете реорганизовать бриллиант. И здесь наследство «Работника» от «Супервизора» совершенно * излишне. –

1

Supervisor содержит два объекта (типа) Employee, the direct one and one over Manager. Неоднозначно называть Employee методами на Supervisor (, который Сотрудник должен называться?). Вместо этого вы можете использовать виртуальное множественное наследование.

3

Вам нужно виртуальное наследование в этом случае:

#include <iostream> 
#include <string> 
using namespace std; 

class Employee 
{ 
protected: 
    string name; 
public: 
    string getname() 
    { 
     return name; 
    } 
    void setname(string name2) 
    { 
     name = name2; 
    } 
    Employee(string name2) 
    { 
     name = name2; 
    } 
    Employee(){} 
}; 

class Manager : public virtual Employee 
{ 
public: 
    string getname() 
    { 
     return ("Manager" + name); 
    } 
    Manager(string name2) : Employee(name2){} 
    Manager() : Employee(){} 
}; 

class Supervisor : public Manager,public virtual Employee 
{ 
public: 
    Supervisor(string name2) : Manager(name2) , Employee(name2){} 
    Supervisor() : Manager() , Employee(){} 
    string getname() 
    { 
     return ("Supervisor" + Employee::getname()); 
    } 
}; 

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

+0

Спасибо. Взял меня немного, потому что я не понимал, что супервизор также должен был наследовать фактически от Работника сначала! – Whovian