在 类 中使用继承/c++ 执行的访问冲突

Access violation executing in classes with inheritance/ c++

我有一个基础 class 参与者,我需要根据他们的奖品或文凭的数量对参与者数组中的对象进行排序。虚函数get_datareturn这个数。但是,当我尝试排序时,我在比较 2 个数字时遇到错误 Access violation executing in row。 if (p[j].Get_Data() < p[i].Get_Data()) { 这是我的完整代码:

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

class Participant {
protected:
    string name;
    string surname;
    vector <string> type;
    int age;
public:
    Participant() : name(""), surname(""), type(), age(0)
    {}
    Participant(string name, string surname, vector <string> type, int age) {
        this->name = name;
        this->surname = surname;
        this->type = type;
        this->age = age;
    };
    Participant(const Participant& other) : name(other.name), surname(other.surname), type(other.type), age(other.age)
    {
    }
    Participant& operator=(const Participant& other)
    {
        name = other.name;
        surname = other.surname;
        type = other.type;
        age = other.age;
        return *this;
    }
    virtual int Get_Data() {
        return 0;
    }
    friend void Sort(Participant* p);
};

class Diploma : public Participant {
protected:
    vector<int> places;
    vector <string> type_d;
public:
    Diploma() : places(), type_d{}
    {}
    Diploma(string name, string surname, vector <string> type, int age, vector<int> places, vector <string> type_d);
    int Get_Data() override {
        cout << "diplom prize" << endl;
        cout << type_d.size() << endl;
        return type_d.size();
    }
};
class Prize : public Participant {
protected:
    vector <int> places;
    vector<string> prize;
public:
    
    Prize(string name, string surname, vector <string> type, int age, vector<int> places, vector<string> prize);
    int Get_Data() override{
        cout << "Cont prize" << endl;
        cout << prize.size() << endl;
        return prize.size();
    }
};
Prize::Prize(string name, string surname, vector <string> type, int age, vector<int> places, vector<string> prize) {
    this->name = name;
    this->surname = surname;
    this->type = type;
    this->age = age;
    this->places = places;
    this->prize = prize;
}
Diploma::Diploma(string name, string surname, vector <string> type, int age, vector<int> places, vector <string> type_d){
    this->name = name;
    this->surname = surname;
    this->type = type;
    this->age = age;
    this->places = places;
    this->type_d = type_d;

}
void Sort(Participant* p) {
    Participant temp;
    for (int i = 0; i < 3; i++) {
        for (int j = i + 1; j < 3; j++)
        {
            if (p[j].Get_Data() < p[i].Get_Data()) {
                temp = p[i];
                p[i] = p[j];
                p[j] = temp;
            }
        }

    }
}

int main() {
    Participant* pa[3];
    pa[0] = new Diploma("Alex", "Smith", { "Geo","Math" }, 17, { 1,6 }, { "first"});
    pa[1] = new Prize("Helen", "Blink", { "IT","Math" }, 18, { 2,2 }, {"Golden medal", "medal"});
    pa[2] = new Prize("Brandon", "Brown", { "IT","Math" }, 18, { 2,2 }, { "Golden medal", "medal","gold"});
    Sort(*pa);
    for (int i = 0; i < 3; i++) {
        pa[i]->Get_Data();
        cout << endl;
    }
}

这里的问题是,当您传递 *pa 时,只有第一个元素是可访问的。如果你在调试模式下 运行 它,你将能够看到在排序函数内部,p[1] 不是一个有效的对象。基本上,只有 p[0] 被传递给函数。您应该将引用传递给数组,即 **pa 到排序函数

void Sort(Participant **p)
{
    Participant *temp;
    for (int i = 0; i < 3; i++)
    {
        for (int j = i + 1; j < 3; j++)
        {
            if (p[j]->Get_Data() < p[i]->Get_Data())
            {
                temp = p[i];
                p[i] = p[j];
                p[j] = temp;
            }
        }
    }
}

int main()
{
    Participant *pa[3];
    pa[0] = new Diploma("Alex", "Smith", {"Geo", "Math"}, 17, {1, 6}, {"first"});
    pa[1] = new Prize("Helen", "Blink", {"IT", "Math"}, 18, {2, 2}, {"Golden medal", "medal"});
    pa[2] = new Prize("Brandon", "Brown", {"IT", "Math"}, 18, {2, 2}, {"Golden medal", "medal", "gold"});
    Sort(pa);
    for (int i = 0; i < 3; i++)
    {
        pa[i]->Get_Data();
        cout << endl;
    }
}