注册 登录
编程论坛 C++教室

求教高人!!!一个c++关于继承的问题望帮助~

hancycrystal 发布于 2010-11-17 20:32, 526 次点击
刚学C++不久,遇到问题不知如何修改,源代码如下,望高手赐教
#include"stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class person{
protected:
    char *name;
    int id;
public:
    person(char *n,int i){
    name=new char[strlen(n)+1];
    strcpy(name,n);
    id=i;
    }
    void display(){
        cout<<"人名:"<<name<<"身份证:"<<id<<endl;
    }
    ~person(){ delete name;}
};
class teacher:virtual public person{
public:
    teacher(char *n,int i,char *d1,char *d2):person(n,i){
    degree=new char[strlen(d1)+1];
    strcpy(degree,d1);
    dep=new char[strlen(d2)+1];
    strcpy(dep,d2);
    }
    void display(){
        person::display();
        cout<<endl;
        cout<<"学历:"<<degree<<"部门:"<<dep<<endl;
    }
protected:
    char *degree;
    char *dep;
};
class student:virtual public person{
public:
    student(char *n,int i,int age,int s):person(n,i){
        old=age;
        sno=s;
        }
    void display(){
        person::display();
        cout<<endl;
        cout<<"年龄:"<<old<<"学号:"<<sno<<endl;
    }
protected:
    int old;
    int sno;
};
class stud{
protected:
    char *addr;
    char *tel;
public:
    stud(char *a,char *t){
    addr=new char[strlen(a)+1];
    strcpy(addr,a);
    tel=new char[strlen(t)+1];
    strcpy(tel,t);
    }
    void display(){
        cout<<"住址:"<<addr<<"电话:"<<tel<<endl;
    }
};
class score:public stud,public student{
public:
    score(float m,float e):stud(),student(){
        math=m;
        eng=e;
    }
    void display(){
        cout<<"数学:"<<math<<"英语:"<<eng<<endl;
    }   
protected:
    float math;
    float eng;

}
int main(){
teacher t1("笑",1218,"本科","财大");
score c1(78.5,80.0);
t1.display();
c1.display();
}
5 回复
#2
zhanghang1232010-11-17 23:48
你的头文件#include"stdafx.h"是怎么写的?
#3
zhoufeng19882010-11-18 16:20
你好。
我看了一下你的代码。有这样几个问题:
1、在score类的声明结束位置少了一个分号。
2、person类、student类、stud类根本没有不带参数的(默认)构造函数,所以你在score类的构造函数引用stud和student的默认构造函数,所以肯定会编译失败。

解决办法:
1、给person类、student类、stud类添加默认的构造函数。
2、在score类中,引用student和stud类的带参数构造函数。
程序代码:
//#include"stdafx.h"
#include <iostream>
#include <string>

using namespace std;

class person
{
protected:
    char *name;
    int id;
public:
    person(char *n, int i)   
    {
        name=new char[strlen(n)+1];
        strcpy(name,n);
        id=i;
    }
    person() /*!!给person构造函数添加默认的参数!!*/
    {
        char * noneName_Tel = "None";
        name=new char[strlen(noneName_Tel)+1];
        strcpy(name,noneName_Tel);
        id=0;
    }
   
    void display()
    {
        cout<<"人名:"<<name<<"身份证:"<<id<<endl;
    }
    ~person(){ delete name;}
};

class teacher:virtual public person
{
public:
    teacher(char *n,int i,char *d1,char *d2):person(n,i)
    {
        degree=new char[strlen(d1)+1];
        strcpy(degree,d1);
        dep=new char[strlen(d2)+1];
        strcpy(dep,d2);
    }
   
    void display()
    {
        person::display();
        cout<<endl;
        cout<<"学历:"<<degree<<"部门:"<<dep<<endl;
    }
protected:
    char *degree;
    char *dep;
};

class student:virtual public person
{
public:
    student(char *n = 0,int i = 0, int age = 0, int s = 0):person(n,i)    /*!!给stud构造函数添加默认的参数,视具体情况改之!!*/
    {
        old=age;
        sno=s;
    }
   
    void display()
    {
        person::display();
        cout<<endl;
        cout<<"年龄:"<<old<<"学号:"<<sno<<endl;
    }
protected:
    int old;
    int sno;
};

class stud
{
protected:
    char *addr;
    char *tel;
public:
    stud(char *a,char *t)   
    {
        addr=new char[strlen(a)+1];
        strcpy(addr,a);
        tel=new char[strlen(t)+1];
        strcpy(tel,t);
    }
   
    /*!!给stud构造函数添加默认的参数,视具体情况改之!!*/
    stud()
    {
        char * noneName_Tel = "None";
        addr=new char[strlen(noneName_Tel)+1];
        strcpy(addr,noneName_Tel);
        tel=new char[strlen(noneName_Tel)+1];
        strcpy(tel,noneName_Tel);
    }

    void display()
    {
        cout<<"住址:"<<addr<<"电话:"<<tel<<endl;
    }
};

class score:public stud,public student
{
public:
    //2、 修改这里,引用stud和student类的带参数的构造函数
    score(float m,float e):stud( "美国纽约", "911"),student( "杰森.斯坦森", 1, 35, 001)
    {
        math=m;
        eng=e;
    }

    void display()
    {
        cout<<"数学:"<<math<<"英语:"<<eng<<endl;
    }   
protected:
    float math;
    float eng;

};        /*!!之前你的代码少了一个分号!!*/

int main()
{
    teacher t1("",1218,"本科","财大");
    score c1(78.5,80.0);
    t1.display();
    c1.display();

    return 0;
}
#4
南国利剑2010-11-18 18:46
楼上说的很详细!
#5
hancycrystal2010-11-18 18:59
回复 3楼 zhoufeng1988
十分感谢~
#6
VenusNefu2010-11-24 12:17
同意三楼的
1