zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Luogu2751 [USACO Training4.2]工序安排Job Processing
    BZOJ4653: [Noi2016]区间
    BZOJ1537: [POI2005]Aut- The Bus
    CF1041F Ray in the tube
    POJ1186 方程的解数
    Luogu2578 [ZJOI2005]九数码游戏
    BZOJ2216: [Poi2011]Lightning Conductor
    CF865D Buy Low Sell High
    BZOJ1577: [Usaco2009 Feb]庙会捷运Fair Shuttle
    几类区间覆盖
  • 原文地址:https://www.cnblogs.com/hcxc/p/10339786.html
Copyright © 2011-2022 走看看