[c++]基类对象作为函数参数(赋值兼容规则)

编程处理教师的基本情况。要求:

1、定义一个“person”类,用来存储及处理人的姓名、性别、年龄,成员函数自定;

2、定义“teacher”类,公有继承“person”类用来存储教师所在学院、所学专业、学历、学位、职称、教龄等,成员函数自定。

3、处理程序,主要包括:

⑴显示姓名、性别、年龄函数:既能显示person对象的姓名、性别、年龄,又能显示teacher对象的姓名、性别、年龄(用person引用对象为形参);

⑵显示教师所在学院、所学专业、学历、学位、职称、教龄的函数;

⑶ main()函数:分别定义persor对象及teacher对象,并输入不同对象相关值,调用成员函数设置对象的值,调用显示函数显示相应值。

#ifndef __person__person__
#define __person__person__
#include<iostream>
using namespace std;
#include<string.h>
class person
{
protected:
    char *name;
    char *sex;
    int age;
public:
    person(char *na,char *se,int ag);
    void set_person(char *na,char *se,int ag);
    char* get_name()
    {return name;}
    char* get_sex()
    {return sex;}
    int get_age()
    {return age;}
    void print();
    ~person()
    {delete []name;delete []sex;}

};

person::person(char *na,char *se,int ag)
{

    name=new char[strlen(na)+1];
    strcpy(name,na);
    sex=new char[strlen(se)+1];
    strcpy(sex,se);
    age = 0;
}

void person:: set_person(char *na,char *se,int ag)
{
    name=new char[strlen(na)+1];
    strcpy(name,na);
    sex=new char[strlen(se)+1];
    strcpy(sex,se);
    age=ag;
}

void person:: print()
{
    for(int i = 0;i<=strlen(name);i++)
    {
        cout<<name[i];
    }
    cout<<endl;
    for(int i = 0;i<=strlen(sex);i++)
    {
        cout<<sex[i];
    }
    cout<<endl;
    cout<<"age:"<<age<<endl;
    cout<<endl;

}

#endif /* defined(__person__person__) */
#ifndef person_teacher_h
#define person_teacher_h

#include"person.h"
class teacher:public person
{
protected:
    char *college;//学院
    char *speciality;//专业
    char *school;//学历
    char *degree;//学位
    char *title;//职称
    int teacherage;//教龄
public:
    teacher(char *na,char* se,int ag,char *co,char *sp,char* sc,char* de,char* ti,int te);
    void set_t(char *na,char* se,int ag,char *co,char *sp,char* sc,char* de,char* ti,int te);
    char* get_college()
    {return college;}
    char* get_speciality()
    {return  speciality;}
    char* get_school()
    {return  school;}
    char* get_degree()
    {return  degree;}
    char* get_title()
    {return  title;}
    int get_teacher_age()
    {return teacherage;}
    ~teacher();
    void print_t(person&p);
};

teacher::teacher(char *na,char* se,int ag,char *co,char *sp,char* sc,char* de,char* ti,int te):person(na,se,ag)
{
    //person::set_person(na, se, ag);
    college=new char[strlen(co)+1];
    strcpy(college,co);
    speciality=new char[strlen(sp)+1];
    strcpy(speciality,sp);
    school=new char[strlen(sc)+1];
    strcpy(school,sc);
    degree=new char[strlen(de)+1];
    strcpy(degree,de);
    title=new char[strlen(ti)+1];
    strcpy(title,ti);
    teacherage =0;
}

void teacher:: set_t(char *na,char* se,int ag,char *co,char *sp,char* sc,char* de,char* ti,int te)
{
    name=new char[strlen(na)+1];
    strcpy(name,na);
    sex=new char[strlen(se)+1];
    strcpy(sex,se);
    age=ag;

    college=new char[strlen(co)+1];
    strcpy(college,co);
    speciality=new char[strlen(sp)+1];
    strcpy(speciality,sp);
    school=new char[strlen(sc)+1];
    strcpy(school,sc);
    degree=new char[strlen(de)+1];
    strcpy(degree,de);
    title=new char[strlen(ti)+1];
    strcpy(title,ti);
    teacherage =te;

}
teacher::~teacher()
{

    delete []college;
    delete []speciality;
    delete []school;
    delete []degree;
    delete [] title;
}

void teacher:: print_t(person &p)
{
    p.print();
    cout<<"-------------------"<<endl;
    for(int i = 0;i<=strlen(college);i++)
    {
        cout<<college[i];
    }
    cout<<endl;
    for(int i = 0;i<=strlen(speciality);i++)
    {
        cout<<speciality[i];
    }
    cout<<endl;
    for(int i = 0;i<=strlen(school);i++)
    {
        cout<<school[i];
    }
    cout<<endl;
    for(int i = 0;i<=strlen(degree);i++)
    {
        cout<<degree[i];
    }
    cout<<endl;
    for(int i = 0;i<=strlen(title);i++)
    {
        cout<<title[i];
    }
    cout<<endl;

    cout<<teacherage<<endl;
    cout<<endl;
}
void fun(person &p)
{
    p.print();
    cout<<endl;
}

#endif
#include "teacher.h"
//#include"person.h"
int main()
{
    person p("s","nv",22);
    teacher T("张老师","女",44,"计科","网络","本科","博士","教授",20);
    T.print_t(p);
    T.set_t("张老师","女",44,"计科","网络","本科","博士","教授",20);
    T.print_t(p);
        cout<<T.get_name()<<endl;
        cout<<T.get_sex()<<endl;
        cout<<T.get_age()<<endl;
        cout<<T.get_college()<<endl;
        cout<<T.get_degree()<<endl;
        cout<<T.get_school()<<endl;
        cout<<T.get_speciality()<<endl;
        cout<<T.get_title()<<endl;
        cout<<T.get_teacher_age()<<endl;
    cout<<"--------------------"<<endl;
    fun(p);
    return 0;
}

//int main()
//{
//    person p("s","nv",22);
//    p.print();
//    p.set_person("w","female",44);
//    p.print();
//    return 0;
//}
时间: 2024-10-17 23:19:11

[c++]基类对象作为函数参数(赋值兼容规则)的相关文章

[c++]基类对象作为函数參数(赋值兼容规则)

编程处理教师的基本情况. 要求: 1.定义一个"person"类.用来存储及处理人的姓名.性别.年龄,成员函数自定: 2.定义"teacher"类,公有继承"person"类用来存储教师所在学院.所学专业.学历.学位.职称.教龄等,成员函数自定. 3.处理程序,主要包含: ⑴显示姓名.性别.年龄函数:既能显示person对象的姓名.性别.年龄,又能显示teacher对象的姓名.性别.年龄(用person引用对象为形參): ⑵显示教师所在学院.所学

类对象做函数参数(传值和传引用)

一.传引用 #include "stdafx.h" #include <iostream> using namespace std; class A { public: virtual void show(){cout<<"A"<<endl;} }; class B:public A { public: virtual void show(){cout<<"B"<<endl;} }; c

赋值兼容规则(C++)

在一定条件下,不同类型的数据之间可以进行类型转换,如可以将整型数据赋给双精度型变量.在赋值之前,先把整型数据转换成双精度型数据,然后再把它赋给双精度型变量.这种不同类型数据之间的自动转换和赋值,称为赋值兼容.在基类和派生类对象之间也存有赋值兼容关系,基类和派生类对象之间的赋值兼容规则是指在需要基类对象的任何地方,都可以使用其子类对象来代替. 下面主要讲积基类和派生类对象之间的赋值兼容1·派生类的对象可以赋值给基类对象. ? ?A a1; //定义基类A对象a1 ? ?B b1; //定义类A的公

(继承及其访问限定符)&&(派生类及其默认成员函数)&&(赋值兼容规则)

◆继承: ★继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. 继承定义格式 ★继承关系&访问限定符 class Base { public: Base() { cout<<"B()" <<endl; } ~Base () { cout<<"~

(继承及其访问限定符)&amp;&amp;(派生类及其默认成员函数)&amp;&amp;(赋值兼容规则)

◆继承: ★继承概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能.这样产生新的类,称派生类.继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程. 继承定义格式 ★继承关系&访问限定符 class Base { public: Base() { cout<<"B()" <<endl; } ~Base () { cout<<"~

转 理解虚基类、虚函数与纯虚函数的概念

原文地址:理解虚基类.虚函数与纯虚函数的概念 引言 一直以来都没有写过一篇关于概念性的文章,因为我觉得这些概念性的东西书本上都有并且说的也很详细写来也无用,今天突发奇想想写 一写,下面就和大家讨论一下虚基类.虚函数与纯虚函数,一看名字就让人很容易觉得混乱.不过不要紧待看完本文后你就会理解了. 正文 虚基类        在说明其作用前先看一段代码 class A { public:     int iValue; }; class B:public A { public:     void bP

【总结】C++基类与派生类的赋值兼容规则

在初步探索了C++继承的语言特性之后,总结下其赋值兼容规则: 1.子类对象可以赋值给父类对象(切割/切片) 在公有继承的前提下,子类是可以赋值给父类对象的,为什么是共有继承(public),因为公有继承会产生"is-a"的关系,这种关系会导致子类中有结构的嵌套这父类的信息,.所以子类可以给父类赋值,期间会发生类似降级的事情,使得赋值成功.若为私有继承,则会产生"has-a"的关系,这种关系是从属关系,基类中的数据仅仅是包含在派生类中,若赋值,则不会产生类似于降级的事

对象做函数参数和函数返回值时,调用复制构造函数,构造函数,析构函数的情况

// 对象做函数参数和返回值.cpp : 定义控制台应用程序的入口点.//exit(0)表示正常退出程序,exit(0)表示异常退出 //在调用input时,编译器用对象A去创建了形参对象temp,调用了复制构造函数,对象A中的数据复制给了对象temp// 在input函数中,执行temp.set(s),为对象temp中数据成员str申请了动态储存空间,并设置了输入的字符串//并没有改变实参A中的数据成员str的储存空间,故在执行语句A.show()后输出的字符串并没有改变.在函数调用结束后 /

理解虚基类、虚函数与纯虚函数的概念

总结 虚基类     1, 一个类可以在一个类族中既被用作虚基类,也被用作非虚基类.     2, 在派生类的对象中,同名的虚基类只产生一个虚基类子对象,而某个非虚基类产生各自的子对象.     3, 虚基类子对象是由最派生类的构造函数通过调用虚基类的构造函数进行初始化的.     4, 最派生类是指在继承结构中建立对象时所指定的类.     5, 派生类的构造函数的成员初始化列表中必须列出对虚基类构造函数的调用:如果未列出,则表示使用该虚基类的缺省构造函数.     6, 从虚基类直接或间接派