IPerson.h

 #ifndef I_PERSON_H_
#define I_PERSON_H_ #include <string>
#include <ostream>
class IPerson
{
public:
virtual std::string GetName() const = ;
virtual int GetAge() const = ;
virtual std::string GetClassName() const = ;
}; std::ostream& operator<<(std::ostream &os, const IPerson &person); #endif

Person.h

 #ifndef PERSON_H_
#define PERSON_H_ #include "IPerson.h" class Person : virtual public IPerson
{
public:
Person(const std::string &name, const int age);
virtual ~Person();
std::string GetName() const override;
int GetAge() const override;
std::string GetClassName() const override;
private:
std::string name;
int age;
}; #endif

Person.cpp

 #include "Person.h"

 Person::Person(const std::string &name, const int age) :
name(name),
age(age)
{
} Person::~Person()
{
} std::string Person::GetName() const
{
return name;
} int Person::GetAge() const
{
return age;
} std::string Person::GetClassName() const
{
return std::string("Person");
} std::ostream& operator<<(std::ostream &os, const IPerson &person)
{
os << "Name: " << person.GetName() << ", "
<< "Age: " << person.GetAge() << ", "; return os;
}

IStudent.h

 #ifndef I_STUDENT_H_
#define I_STUDENT_H_ #include "IPerson.h" class IStudent : virtual public IPerson
{
public:
virtual int GetGrade() const = ;
}; std::ostream& operator<<(std::ostream &os, const IStudent &student); #endif

Student.h

 #ifndef STUDENT_H_
#define STUDENT_H_ #include "IStudent.h"
#include "Person.h" class Student : virtual public IStudent, public Person
{
public:
Student(const std::string &name, const int age, const int grade);
~Student(); int GetGrade() const override;
std::string GetClassName() const override;
private:
int grade;
}; #endif

Student.cpp

 #include "Student.h"

 Student::Student(const std::string &name, const int age, const int grade) :
Person(name, age),
grade(grade)
{
} Student::~Student()
{
} int Student::GetGrade() const
{
return grade;
} std::string Student::GetClassName() const
{
return std::string("Student");
} std::ostream& operator<<(std::ostream &os, const IStudent &student)
{
const IPerson &person = student;
os << person;
os << "Grade: " << student.GetGrade() << ", "; return os;
}

main.cpp

 #include <iostream>
#include "Student.h" using namespace std; int main()
{
Student student(string("Leon"), , );
cout << "Student: " << student << endl; IStudent &iStudent = student;
cout << "IStudent: " << iStudent << endl;
cout << "ClassName: " << iStudent.GetClassName() << endl; IPerson &iPerson = student;
cout << "IPerson: " << iPerson << endl;
cout << "ClassName: " << iPerson.GetClassName() << endl; cout << sizeof(IPerson) << endl;
cout << sizeof(Person) << endl;
cout << sizeof(IStudent) << endl;
cout << sizeof(Student) << endl; return ;
}

测试结果

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

C++接口与实现的抽象分离的更多相关文章

  1. .NET Core CSharp初级篇 1-5 接口、枚举、抽象

    .NET Core CSharp初级篇 1-5 本节内容类的接口.枚举.抽象 简介 问题 如果你需要表示星期或者是某些状态,使用字符串或者数字是否不直观? 你是否发现,无论何种电脑,它的USB口的设计 ...

  2. Mybatis mapper接口与xml文件路径分离

    为什么分离 对于Maven项目,IntelliJ IDEA默认是不处理src/main/java中的非java文件的,不专门在pom.xml中配置<resources>是会报错的,参考这里 ...

  3. Jmeter接口测试之用例数据分离

    之前我们的用例数据都是配置在 Jmeter Http 请求中,每次需要增加,修改用例都需要打开 jmeter 重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢? ...

  4. unittest管理接口用例(数据分离-读取excel)

    1.简单读取 #coding=utf-8 #调用封装好的excel读取公共方法 from python_API.common.ReadExcel import ReadExcel import req ...

  5. unittest 管理接口用例(数据分离-读取excel)

    1.公共模块 ---> login.xls """ common (package) ---> ReadFile.py """ ...

  6. 多场景抢红包业务引发.NETCore下使用适配器模式实现业务接口分离

    事情的起因 我们公司现有一块业务叫做抢红包,最初的想法只是实现了一个初代版本,就是给指定的好友单发红包,随着业务的发展,发红包和抢红包的场景也越来越多,目前主要应用的场景有:单聊发红包.群聊发红包.名 ...

  7. 从壹开始前后端分离[.NetCore] 37 ║JWT完美实现权限与接口的动态分配

    缘起 本文已经有了对应的管理后台,地址:https://github.com/anjoy8/Blog.Admin 哈喽大家好呀!又过去一周啦,这些天小伙伴们有没有学习呀,已经有一周没有更新文章了,不过 ...

  8. Java面向对象理解_代码块_继承_多态_抽象_接口

    面线对象: /* 成员变量和局部变量的区别? A:在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上 B:在内存中的位置不同 成员变量:在堆内存 局部变量:在栈内存 C:生 ...

  9. java===java基础学习(15)---抽象,接口

    抽象 //这就是一个抽象类 abstract class Animal { String name; int age; abstract public void cry(); } //当一个类继承的父 ...

随机推荐

  1. poj100纪念

  2. Spring+Shiro的踩坑

    今天想给某个Service的某些方法添加Cache,这个记为A,用的springboot,照常在方法上加上Cacheable注解,测试缓存生效,搞定.然后再在第二个Service,记为B,添加Cach ...

  3. Oracle 自定义函数、存储过程

    讲函数之前,先介绍一下程序结构 3.程序结构 新建一个测试窗口,举一个小例子 declare -- 声明变量,包括游标 begin -- 执行部分 dbms_output.put_line('hell ...

  4. 移动端bug集合

    移动端软键盘遮挡输入框&IOS移动端点击输入框字体放大&IOS点击闪烁 移动端软键盘遮挡输入框  ——>  转载自: https://www.jb51.net/article/1 ...

  5. Vue导出json数据到Excel表格

    一.安装依赖 npm install file-saver --save npm install xlsx --save npm install script-loader --save-dev 二. ...

  6. PHP 【三】

    字符串变量 $txt = "Hello world!"; 创建字符串后,就可以对它操作,可以在函数中使用,或者把它存储在变量中 并置运算符 [把两个字符串值连接起来] <?p ...

  7. poj 2155 matrix 二维线段树 线段树套线段树

    题意 一个$n*n$矩阵,初始全为0,每次翻转一个子矩阵,然后单点查找 题解 任意一种能维护二维平面的数据结构都可以 我这里写的是二维线段树,因为四分树的写法复杂度可能会退化,因此考虑用树套树实现二维 ...

  8. C++设计模式——组合模式

    问题描述 上图,是一个公司的组织结构图,总部下面有多个子公司,同时总部也有各个部门,子公司下面有多个部门.如果对这样的公司开发一个OA系统,作为程序员的你,如何设计这个OA系统呢?先不说如何设计实现, ...

  9. C#+EntityFramework编程方式详细之Code First

    Code First Code First模式即“代码优先”模式,是从EF4.1开始新建加入的功能.使用Code First模式进行EF开发时只需要编写对应的数据类,然后自动生成数据库. Code F ...

  10. vue脚手架安装步骤vue-cli

    1.环境搭建     安装node.js: 从node.js官网下载并安装node,安装过程很简单.  npm 版本需要大于 3.0,如果低于此版本需要升级它: # 查看版本 $ npm -v 2.3 ...