2 sinat 34810705 sinat_34810705 于 2016.05.11 15:54 提问

派生类存放在基类类型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类导致的,但是即使我将其派生并且重新放置派生类进去,它依然只认基类不认派生类函数啊!怎么办呀!

2个回答

oyljerry
oyljerry   Ds   Rxr 2016.05.11 16:00

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

 base *p = new derive()
CSDNXIAOD
CSDNXIAOD   2016.05.11 16:02

基类和派生类的虚函数表
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
【C++】Vector中存储派生类(多个子类继承一个基类)
(一)问题描述 往vector push_back了一个派生类对象,现在如何从这个vector中取出这个派生类对象?并且可以使用派生类中的接口函数? (二)解决方案 1.对象切割(Object slicing) 一般来说,衍生类所占的存储空间一般都比基础类大。当用基础类强制转换派生类物件(对象)指標时就会产生对象切割(Object slicing),即:当把一个派生类对象赋给一个基
基类+派生类 各成员在内存中的摆放和赋值顺序
/* 2014-07-24 问题:基类的私有成员是否 影响 派生类的sizeof?它们在内存中的位置怎么排列? 1. 即使基类中私有和受保护成员对用户是不可见的,但它们仍旧在内存中占据位置。 2. 派生类中变量不是根据访问标号pub/pro/pri来排列的。而是根据 1)不同类 2)在类中声明顺序来排序的 */ #include using namespace std;
C++基类与派生类的函数调用情况
 在定义了基类的指针与派生类的对象,或者是派生类指针与基类的对象。 在函数调用的时候,如果该函数在基类中被定义为虚函数,那么在调用的时候看该指针(包括基类指针和派生类指针)所指向的对象,如果是派生类的对象就调用派生类中重写的函数,如果是基类的对象就调用基类中的函数。如果该函数为非虚函数,那么看该指针的类型,如果是基类的指针就调用基类中的函数,如果是派生类的指针就调用派生类中的函数。
C++中派生类重写基类重载函数时需要注意的问题:派生类函数屏蔽基类中同名函数
派生类可以继承基类中的非私有函数成员,当然也就可以继承其中非私有的被重载的函数。如下: 【参考代码】 class Base { public: void print() { cout << "print() in Base." << endl; } void print(int a) { cout << "print(int a) in Base." <<
C++派生类中与基类同名函数的调用问题
本文所探讨的问题建立在公共继承的公有函数的基础上。 一、派生类,即子类中的函数与基类的函数的情况有以下三种。 1、不是同名函数 2、函数名相同,形参的个数或类型不同。 3、函数名相同,形参的个数和类型也相同。 二、接下来就这三种情况探讨子类调用基类函数的问题 1、在一般情况下,子类中的函数与基类的函数不是同名函数,此时,可以直接通过子类对象调用基类的函数。 例: 基类CBase  
基类中this指针和派生类对象的关系,同名隐藏原则和作用域的示例
最近在分析cocos2d-x启动代码的时候,不小心看到单例的程序,
C++派生类函数调用基类的函数
在MFC的程序中,我们经常会看到下面的程序片段,
基类和派生类之间的同名函数,存在重载吗?
-
在派生类中调用基类方法。
base 关键字用于从派生类中访问基类的成员: 调用基类上已被其他方法重写的方法。 指定创建派生类实例时应调用的基类构造函数。 基类访问只能在构造函数、实例方法或实例属性访问器中进行。 示例: 在派生类中调用基类方法。 // base 关键字// 访问基类成员using System;public class BaseClass{    protected string _cl
C++基类,派生类,同名覆盖原则
/ 同名覆盖原则.cpp: 主项目文件。   #include "stdafx.h"   #include   #include   using namespace std;   class One   {   private:       string name;       int age;   public:       virtual ~One( )=0{ }