Алмазная проблема с множественным наследованием C ++ - PullRequest
1 голос
/ 22 мая 2019

У меня есть домашнее задание с заданным кодом main.cpp, которое нельзя изменять. Согласно этому main.cpp и простому примеру input и output (ниже), я должен завершить программу. Мои попытки: я пытаюсь создать 4 класса, класс Person; рабочий класса; ученик класса; класс InService; в моей основной функции через создание экземпляра объекта класса InService я передаю 4 параметра (имя, пол, studentNo, workerNo); и с помощью указателя типа базового класса, получить желаемый результат. Это сообщение об ошибке: [Ошибка] нет уникального окончательного переопределения для «виртуального std :: string Person :: getName ()» в «InService» [Ошибка] нет уникальной окончательной переопределения для 'virtual int Person :: getSex ()' в 'InService'

Я пытался использовать виртуальное наследование для этого, но я не могу понять, как решить эту проблему. Я провел некоторое исследование по виртуальному наследованию и сослался на других экспертов ответов , но все еще путался со всем ООП.

//Inservice.h
#include<string>
using namespace std;
class Person{
    public:
        Person();
        ~Person();      
        string name;
        int sex;
        virtual string getName() = 0;
        virtual int getSex()  = 0;
};
///////////////////////////////////////////////////
class Student:virtual public Person{
    public:
        Student();
        ~Student();
        string sno;

        virtual string getName() {
        return name;
        }

        virtual int getSex(){
            return sex;
        }

        string getSno(){
            return sno;
        }
};
//////////////////////////////////////////////////
class Worker:virtual public Person{
    public:
        Worker();
        ~Worker();
        string wno;

        virtual std::string getName(){
        return name;
        }

        virtual int getSex(){
            return sex;
        }

        string getWno(){
            return wno;
        }
};
///////////////////////////////////////////////////////
class InService: public Student, public Worker{
    public:
    InService(string _name, int _sex, string _sno, string _wno){
        Person::name = _name;
        Person::sex - _sex;
        Worker::wno = _wno;
        Student::sno = _sno;
    }
};
///////////////////////////////////////////////////////

//main.cpp
#include <iostream>
#include "inservice.h"
using namespace std;

int main() {
    string name, sno, wno;
    int sex;

    cin >> name;
    cin >> sex;
    cin >> sno;
    cin >> wno;

    InService is(name, sex, sno, wno);

    Person* p = &is;
    Student* s = &is;
    Worker* w = &is; 

    cout << p->getName() << endl;
    cout << p->getSex() << endl;

    cout << s->getName() << endl;
    cout << s->getSex() << endl;
    cout << s->getSno() << endl;

    cout << w->getName() << endl;
    cout << w->getSex() << endl;
    cout << w->getWno() << endl;
    return 0;
}

Предположим, мой вход:

Jack  
1 //1-for male; 0 -for female  
12345678 //studentNo
87654321  //workerNo  

Я ожидаю, что результат будет:

Jack  
1  
12345678   
Jack  
1  
87654321  

1 Ответ

0 голосов
/ 22 мая 2019
 InService(string _name, int _sex, string _sno, string _wno){
        Person::name = _name;
        Person::sex - _sex;
        Worker::wno = _wno;
        Student::sno = _sno;
    }

Там есть опечатка, Person :: sex - _sex;должен быть Person :: sex = _sex;

Также вы можете удалить виртуальную функцию name и sex и использовать ее как стандартную функцию Person, так как она абсолютно одинакова для всех классов, производных от нее.Это устранит неоднозначность функций getName и getSex, на которые должна указывать виртуальная таблица класса InService.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...