C++ 向基类向量添加子类

C++ 向基类向量添加子类,c++,pointers,vector,C++,Pointers,Vector,所以我拼命想弄明白如何在C/C++中将子类对象添加到基类向量中。我环顾四周,发现我需要使用指针和内存地址。除此之外,我还没有找到答案 这个例子很简单。我有一本预约簿,上面有一系列每月、每天和一次性的预约。这些需要存储在向量中 另外,如果有人能给我推荐一个好的学习资源,我将不胜感激。良好的学习资源。我有一位教授,他班上70%的人都退学了,我需要一个及格分数。T.T #pragma once #include "Appointment.h" #include "Daily.h" #include "

所以我拼命想弄明白如何在C/C++中将子类对象添加到基类向量中。我环顾四周,发现我需要使用指针和内存地址。除此之外,我还没有找到答案

这个例子很简单。我有一本预约簿,上面有一系列每月、每天和一次性的预约。这些需要存储在向量中

另外,如果有人能给我推荐一个好的学习资源,我将不胜感激。良好的学习资源。我有一位教授,他班上70%的人都退学了,我需要一个及格分数。T.T

#pragma once
#include "Appointment.h"
#include "Daily.h"
#include "Monthly.h"
#include "Onetime.h"

using namespace std; 

int main() {
    vector<Appointment *> appointmentBook;
    bool loop = true; 
    string input; 

    while (loop) {
        cout << "Enter the kind of appointment or q to quit: (d/m/o/q)" << endl; 
        cin >> input; 

        if (input == "d") {
            appointmentBook.push_back(Daily().read());
        } else if(input == "m") {

        }
        else if (input == "o") {

        }
        else {
            exit(0); 
        }
    }
    return 0; 
}
#pragma一次
#包括“约会.h”
#包括“Daily.h”
#包括“每月.h”
#包括“Onetime.h”
使用名称空间std;
int main(){
矢量任命书;
布尔循环=真;
字符串输入;
while(循环){
不能输入;
如果(输入=“d”){
任命书。推回(每日()阅读());
}否则如果(输入=“m”){
}
否则如果(输入=“o”){
}
否则{
出口(0);
}
}
返回0;
}

首先,以下方法可能有效:


在这里,您无需关心删除已分配的对象,
shared\u ptr
将为您完成此操作。

请提供一个。特别是,我看到零“子类”类型。如果我们不知道你的确切问题,我们也帮不了你。每日、每月和一次性都是预约的子类。因此,任命向量。我添加代码并不是为了防止不需要额外的信息,因为这些类的代码是无错误的。我只是想弄清楚如何将子类存储在基类向量中。@Ricco
Daily().read()
返回什么?Ricco,在这里发布之前,您的工作是从代码中提取一个最小但完整的示例!既然您想跳过不相关的部分,那么while循环呢?这有什么关系?还是不可移植的
#pragma once
?还有,你提到的“C/C++”是什么?
vector
不起作用。试图将任何派生对象放入其中会在复制时对其进行切片,从而最终得到基本对象。@TheUndeadFish已修复。感谢和抱歉,在10年的C++中,我从来没有面对过切片问题。
vector<Appointment> apps;
AppointmentChild child;
apps.push_back(child);
vector<Appointment*> apps;
auto child = new AppointmentChild;
apps.push_back(child);

delete child; // Don't forget to delete the object, when it is no more in use.
vector<shared_ptr<Appointment>> apps;
auto child = make_shared<AppointmentChild>();
apps.push_back(child);