C++接口与实现的抽象分离

IPerson.h

 1 #ifndef I_PERSON_H_
 2 #define I_PERSON_H_
 3 
 4 #include <string>
 5 #include <ostream>
6 class IPerson 7 { 8 public: 9 virtual std::string GetName() const = 0; 10 virtual int GetAge() const = 0; 11 virtual std::string GetClassName() const = 0; 12 }; 13 14 std::ostream& operator<<(std::ostream &os, const IPerson &person); 15 16 #endif

 

Person.h

 1 #ifndef PERSON_H_
 2 #define PERSON_H_
 3 
 4 #include "IPerson.h"
 5 
 6 class Person : virtual public IPerson
 7 {
 8 public:
 9     Person(const std::string &name, const int age);
10     virtual ~Person();
11     std::string GetName() const override;
12     int GetAge() const override;
13     std::string GetClassName() const override;
14 private:
15     std::string name;
16     int age;
17 };
18 
19 #endif

 

Person.cpp

 1 #include "Person.h"
 2 
 3 Person::Person(const std::string &name, const int age) :
 4     name(name), 
 5     age(age)
 6 {
 7 }
 8 
 9 Person::~Person()
10 {
11 }
12 
13 std::string Person::GetName() const
14 {
15     return name;
16 }
17 
18 int Person::GetAge() const
19 {
20     return age;
21 }
22 
23 std::string Person::GetClassName() const
24 {
25     return std::string("Person");
26 }
27 
28 std::ostream& operator<<(std::ostream &os, const IPerson &person)
29 {
30     os << "Name: " << person.GetName() << ", "
31         << "Age: " << person.GetAge() << ", ";
32 
33     return os;
34 }

 

IStudent.h

 1 #ifndef I_STUDENT_H_
 2 #define I_STUDENT_H_
 3 
 4 #include "IPerson.h"
 5 
 7 
 8 class IStudent : virtual public IPerson
 9 {
10 public:
11     virtual int GetGrade() const = 0;
12 };
13 
14 std::ostream& operator<<(std::ostream &os, const IStudent &student);
15 
16 #endif

 

Student.h

 1 #ifndef STUDENT_H_
 2 #define STUDENT_H_
 3 
 4 #include "IStudent.h"
 5 #include "Person.h"
 6 
 7 class Student : virtual public IStudent, public Person
 8 {
 9 public:
10     Student(const std::string &name, const int age, const int grade);
11     ~Student();
12 
13     int GetGrade() const override;
14     std::string GetClassName() const override;
15 private:
16     int grade;
17 };
18 
19 #endif

 

Student.cpp

 1 #include "Student.h"
 2 
 3 Student::Student(const std::string &name, const int age, const int grade) :
 4     Person(name, age),
 5     grade(grade)
 6 {
 7 }
 8 
 9 Student::~Student()
10 {
11 }
12 
13 int Student::GetGrade() const
14 {
15     return grade;
16 }
17 
18 std::string Student::GetClassName() const
19 {
20     return std::string("Student");
21 }
22 
23 std::ostream& operator<<(std::ostream &os, const IStudent &student)
24 {
25     const IPerson &person = student;
26     os << person;
27     os << "Grade: " << student.GetGrade() << ", ";
28 
29     return os;
30 }

 

main.cpp

 1 #include <iostream>
 2 #include "Student.h"
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     Student student(string("Leon"), 14, 8);
 9     cout << "Student: " << student << endl;
10     
11     IStudent &iStudent = student;
12     cout << "IStudent: " << iStudent << endl;
13     cout << "ClassName: " << iStudent.GetClassName() << endl;
14 
15     IPerson &iPerson = student;
16     cout << "IPerson: " << iPerson << endl;
17     cout << "ClassName: " << iPerson.GetClassName() << endl;
18 
19     cout << sizeof(IPerson) << endl;
20     cout << sizeof(Person) << endl;
21     cout << sizeof(IStudent) << endl;
22     cout << sizeof(Student) << endl;
23 
24     return 0;
25 }

 

测试结果

Student: Name: Leon, Age: 14, Grade: 8,
IStudent: Name: Leon, Age: 14, Grade: 8,
ClassName: Student
IPerson: Name: Leon, Age: 14,
ClassName: Student
4
48
12
64