yaa*_*man 2 c++ virtual inheritance overriding
我们有一个名为Student的父类.我们有一个儿童班:StudentCS.
Student.h:
#include <iostream.h>
#include<string.h>
#include<vector.h>
#include "Course.h"
class Course;
class Student {
public:
Student();
Student(int id, std::string dep, std::string image,int elective);
virtual ~Student();
virtual void Study(Course &c) const; // this is the function we have a problem with
void setFailed(bool f);
[...]
};
Run Code Online (Sandbox Code Playgroud)
Student.cpp:
#include "Student.h"
[...]
void Student::Study(Course &c) const {
}
Run Code Online (Sandbox Code Playgroud)
我们有StudentCS.h:
#include "Student.h"
class StudentCS : public Student {
public:
StudentCS();
virtual ~StudentCS();
StudentCS (int id, std::string dep, std::string image,int elective);
void Study(Course &c) const;
void Print();
};
Run Code Online (Sandbox Code Playgroud)
和StudentCS.cpp:
void StudentCS:: Study (Course &c) const{
//25% to not handle the pressure!
int r = rand()% 100 + 1;
cout << r << endl;
if (r<25) {
cout << student_id << " quits course " << c.getName() << endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我们创建主要的学生:
Student *s;
vector <Student> uniStudent;
[...]
if(dep == "CS")
s = new StudentCS(student_id,dep,img,elective_cs);
else
s = new StudentPG(student_id,dep,img,elective_pg);
uniStudent.push_back(*s);
Run Code Online (Sandbox Code Playgroud)
然后我们打电话去学习,但是我们得到了父母的学习,而不是孩子!请帮忙!
代码编译但是当运行并在uniStudent.Study()上调用时,它使用父代而不是子代
编辑:编辑后问题很明显.
问题是您将基础具体对象存储在STL容器中.这会产生一个称为对象切片的问题.
当您将学生添加到a时vector<Student>,由于向量的分配器是在Student类上构建的,因此只会丢弃有关派生类的每个附加信息.将元素插入向量后,它们将成为基本类型.
要解决您的问题,您应该使用a vector<Student*>并直接存储对其中学生的引用.因此,分配器只与指针相关,不会对对象进行切片.
vector<Student*> uniStudent;
...
uniStudent.push_back(s);
uniStudent[0]->study();
Run Code Online (Sandbox Code Playgroud)
请注意,您可能希望使用智能指针以更强大的方式管理所有内容.
| 归档时间: |
|
| 查看次数: |
6625 次 |
| 最近记录: |