msdn-派生类存放在基类类型vector中,怎么用派生类的函数?

问题描述

派生类存放在基类类型vector中,怎么用派生类的函数?
我已经成功将派生类存放在基类类型的vector表中,也能定位位置,就是不知道怎么使用派生类的函数,只能用基类的函数,求解啊!

#include
#include
#include
#include
using namespace std;
class people
{
public:
people()
{
name = new char[20];
code = 0;
sex = new char[8];
number = new char[20];

};bool people::operator==(const people &rhs) const{    return (code == rhs.code);};void in_mess(){    cout << ""输入名字、编号、性别、身份证号"" << endl;    cin >> name;    cin >> code;    cin >> sex;    cin >> number;      };const int consttime = 10;void out_mess(){    cout << ""名字:"" << name << endl;    cout << ""编号:"" << code << endl;    cout << ""性别:"" << sex << endl;    cout << ""身份证号:"" << number << endl;};int seach(){    return code;};void eq_SC(int a){    code = a;}

private:
char *name;
int code;
char *sex;
char *number;

};
class student : virtual public people
{
public:
student(){};
friend istream&operator>>(istream&in student &p)
{
p.in_mess();
return in;
};
void out_messs()
{
people::out_mess();
cout << ""身份:学生"" << endl;
cout << ""总学时:"" << consttime << endl;

}

};
class teacher :virtual public people
{
public:
teacher()
{
teachtime = 0;

};friend istream&operator>>(istream&in teacher &p){    p.in_mess();    cout << ""身份:老师"" << endl;    cout << ""输入教学学时"" << endl;    in >> p.teachtime;    return in;}void out_messs(){    people::out_mess();    cout << ""身份:老师"" << endl;    cout << ""总学时:"" << teachtime + consttime << endl;}int get_TT(){    return teachtime + consttime;}

private:
int teachtime;
};
class graduate : virtual public student
{
public:
graduate()
{
freetime = 0;
};
friend istream&operator>>(istream&in graduate &p)
{
p.in_mess();
cout << ""身份:研究生"" << endl;
cout << ""输入自由研究时间"" << endl;
in >> p.freetime;
return in;
}
void out_messs()
{
people::out_mess();
cout << ""身份:研究生"" << endl;
cout << ""总学时:"" << freetime + consttime << endl;

}int get_FT(){    return freetime+consttime;}

private:
int freetime;
};
class TA : public graduate public teacher
{
public:
TA()
{
resarch_time = 0;
};
friend istream&operator>>(istream&in TA &p)
{
p.in_mess();
cout << ""身份:助教"" << endl;
cout << ""输入做研究和一定教学工作学时"" << endl;
in >> p.resarch_time;
return in;
};
void out_messs()
{
people::out_mess();
cout << ""身份:助教"" << endl;
cout << ""总学时:"" << resarch_time +consttime+get_FT()+get_TT() << endl;
};
private:
int resarch_time;
};
void main()
{
cout << ""当前为空表,请输入第一个人员的信息"" << endl;
cout << ""插入身份为 1.学生 2.老师 3.研究生 4.助教 请输入序号"" << endl;
int num=0;
people first;
cin >> num;
if (num == 1)
{
student first;
cin >> first;
}
else if (num == 2)
{
teacher first;
cin >> first;

}
else if (num == 3)
{
graduate first;
cin >> first;

}
else if (num == 4)
{
TA first;
cin >> first;

};

vector<people>::iterator location;//迭代子vector<people>V(1 first);while (1){        int gong;        cout << ""请选择功能"" << endl;        cout << ""1.插入新的信息 2.查找 "" << endl;        cin >> gong;        if (gong == 1)        {            cout << ""插入身份为  1.学生  2.老师  3.研究生  4.助教  请输入序号"" << endl;            int num;            cin >> num;            if (num == 1)            {                student human;                cin >> human;                V.push_back(human);            }            else if (num == 2)            {                teacher human;                cin >> human;                V.push_back(human);            }            else if (num == 3)            {                graduate human;                cin >> human;                V.push_back(human);            }            else if (num == 4)            {                TA human;                cin >> human;                V.push_back(human);            };        }        else if (gong == 2)        {            people _new;            int studycodee;            cout << ""请输入他(她)的编号"" << endl;            cin >> studycodee;            _new.eq_SC(studycodee);            location = find(V.begin() V.end() _new);            if (location != V.end())            {                V[location - V.begin()].out_mess();            }            else                cout << ""未找到"" << endl;        }}

}

下面查找功能只能用到其基类的函数,用不到派生类的,我觉得是因为vector是存放的people类导致的,但是即使我将其派生并且重新放置派生类进去,它依然只认基类不认派生类函数啊!怎么办呀!

解决方案

你需要用多态,
而且vector中声明基类指针,然后来得到派生类。这样通过基类指针调用虚函数来实现对派生类的调用

 base *p = new derive()

解决方案二:
基类和派生类的虚函数表

时间: 2024-05-25 15:30:49

msdn-派生类存放在基类类型vector中,怎么用派生类的函数?的相关文章

java中方法是某个类的属性,那么方法是某个类的对象的属性么

问题描述 java中方法是某个类的属性,那么方法是某个类的对象的属性么 java中方法是某个类的属性,那么方法是某个类的对象的属性么 它们之间的关系是什么 解决方案 方法和变量统称为属性,方法是类的方法.如果是静态类就可以用类去调用,如果是普通类,需要先实例化,也就是new,用类的对象来调用. 解决方案二: java中类,对象,方法和属性 对象是定义类出来的. A a=new A(): a就是A类的对象. 方法是在类里面定义出来的 public class A(){ int b=3; publi

面向对象-如何用数组存放一个基类派生的多种派生类?

问题描述 如何用数组存放一个基类派生的多种派生类? 我写了一个基类,用其派生了多个派生类, 接着我生成一个基类数组,再在程序里按输入情况对应将每个数组成员变成派生类, 请问这样如何实现? 我试过 p[i]=new student; 但是说i不能是变量 解决方案 vector list 解决方案二: 为啥不用list,有封装好的方法 解决方案三: 用list vector等支持存放指针的数组 然后你存入基类类型指针 用多态方式处理 解决方案四: p[i]得是指针数组呦

继承-C++,类模板作为基类派生及指针的问题。

问题描述 C++,类模板作为基类派生及指针的问题. **C++,类模板作为基类派生某几个类,可不可以定义指向基类的指针,然后通过这个指针来指向各个派生类?大家帮忙解答一下.我是初学者,勿喷啊!** 以下面例子为例.C++的. #include<iostream> using namespace std; template<class T1> class A { protected: T1 a; public: virtual void output1(); virtual void

派生类与派生类对象对基类成员的访问

区分"派生类对象"和"派生类"对基类成员的访问权限.    "派生类对象"对基类成员的访问权限:      (1)对于公有继承,只有基类的公有成员可以被"派生类对象"访问,其他(保护和私有)成员不能被访问.      (2)对于私有继承和保护继承,基类中所有成员都不能被"派生类对象"访问.    "派生类"对基类中成员的访问权限:     (1)对于公有继承,基类中的公有成员和保护成

在C++中 怎么在派生类中使用基类中的成员变量 例如如下代码 怎样才能使其跑起来

问题描述 在C++中 怎么在派生类中使用基类中的成员变量 例如如下代码 怎样才能使其跑起来 #include using namespace std; class love{ public: char you() { int i=87, j=74 ,k=89; char a=char(i),b=char(j),c=char(k); return 0; } }; class Me:private love{ public: Me():l(a),u(b),n(c){} char const l,u,

c++派生类怎样调用基类的操作符函数

问题描述 c++派生类怎样调用基类的操作符函数 派生类中怎样调用基类的输出操作符重载函数,想输出基类的私有成员,利用子类的对象 解决方案 a.base::operator ==(b); base::operator=(a,b); 可以这么调用

走近VB.Net(一),VB中的族,类,对象(摘录部分MSDN)

对象 走近VB.Net(一),VB中的族,类,对象 VB.Net是面向对象(object-oriented)的,又称为物件(object)导向(oriented).在VB.Net中所有的变量类型都是基于object,而不是VariantDim x As Variant 会被升级为 Dim as object.如果你不理解对象,暂时你可以把他理解为一段数据,他是实际存在于内存的,所以对象以称为实例(instance)而类(class)就是类别,他定义一群对象,是一个对象的群体,并定义方法成员.所以

基类-在MFC中如何使用自定义类

问题描述 在MFC中如何使用自定义类 我建立了MFC的对话框,并自定义了基类是static的派生类,在派生类中有自定义了许多函数,我在对话框中要使用该自定义类,怎么才能使用呢?工具条上没有该自定义的控件啊 解决方案 感觉你是想自定义控件,解决方法如下:1.新建一个MFC Application,选择Dialog based,其他一路默认就行了.2.把Custom Control 放到Dialog中.3.把控件属性Class,写成"MFCDiagramCtrl",这里很重要,如果不加,最

c++构造函数的初始化列表中初始化了一个类类型的成员,调用的是类类型的复制构造函数吧?

问题描述 c++构造函数的初始化列表中初始化了一个类类型的成员,调用的是类类型的复制构造函数吧? 如题:c++构造函数的初始化列表中初始化了一个类类型的成员,调用的是类类型的复制构造函数吧? 解决方案 什么?复制构造函数? 解决方案二: C++类构造函数列表初始化C++类构造函数初始化列表c++中什么类型的成员变量只能在构造函数的初始化列表中进行 解决方案三: 真是初始化列表,跟复制构造函数没关系,调用复制构造函数要看你是如何初始化的 解决方案四: 参数列表初始化成员是调用成员的构造函数,但是什