类设计总结
实例一
本实例设计了三个类。第一个是基类Person类,具有姓名(m_name)和年龄(m_age)属性。第二个学生类Student公有继承Person类,拥有性别(m_sex)属性。第三个老师类Teacher公有继承Person类,拥有学科(m_subject)属性。
Person.h
#ifndef DMA_H_
#define DMA_H_
#include <iostream>
// 基类
class Person
{
private:
char *m_name;
// 姓名
int m_age;
// 年龄
public:
Person(const char *name = "", int age = 0); // 构造函数
Person(const Person &p);
// 复制构造函数
virtual ~Person();
// 虚析构函数
Person& operator=(const Person &p); // 赋值运算符
friend std::ostream& operator<<(std::ostream &os, const Person& p);
// 友元函数
};
// 派生类
class Student : public Person
// 公有继承
{
private:
enum {SEX_LEN = 10};
// 枚举
char m_sex[SEX_LEN];
// 性别
public:
Student(const char *name = "", int age = 0, const char *sex = "female");
// 构造函数
Student(const Person &p, const char *sex = "female");
// 构造函数
friend std::ostream& operator<<(std::ostream& os, const Student &stu);
// 友元函数
};
// 派生类
class Teacher : public Person
// 公有继承
{
private:
char *m_subject;
// 科目
public:
Teacher(const char *name = "", int age = 0, const char *subject = "Chinese");
// 构造函数
Teacher(const Person& p, const char *subject = "Chinese");
// 构造函数
Teacher(const Teacher &tea);
// 复制构造函数
Teacher& operator=(const Teacher &tea); // 赋值运算符
virtual ~Teacher(); // 析构函数
friend std::ostream& operator<<(std::ostream& os, const Teacher& tea);
// 友元函数
};
#endif
Person.cpp
#include "Person.h"
#include <cstring>
Person::Person(const char *name, int age)
{
m_name = new char[strlen(name) + 1];
strcpy(m_name, name);
m_age = age;
}
Person::Person(const Person& p)
{
m_name = new char[strlen(p.m_name) + 1];
strcpy(m_name, p.m_name);
m_age = p.m_age;
}
Person::~Person()
{
delete [] m_name;
m_name = nullptr;
}
Person& Person::operator=(const Person& p)
{
if(this == &p)
{
return *this;
}
delete [] m_name;
m_name = new char[strlen(p.m_name) + 1];
strcpy(m_name, p.m_name);
m_age = p.m_age;
return *this;
}
std::ostream& operator<<(std::ostream &os, const Person& p)
{
os << "name: " << p.m_name << std::endl;
os << "age: " << p.m_age << std::endl;
return os;
}
Student::Student(const char *name, int age, const char *sex)
: Person(name, age)
// 初始化成员列表
{
strncpy(m_sex, sex, SEX_LEN - 1);
m_sex[SEX_LEN - 1] = '