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. 干货分享:让你分分钟学会 javascript 闭包(转)

    闭包,是javascript中独有的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述,直 ...

  2. innodb表碎片处理

    本次测试环境是 mysql 5.7.23,表空间为每个表单独表空间 mysql> sHOW VARIABLES LIKE 'innodb_file_per_tabl%'; +---------- ...

  3. 检测浏览器是否支持ES6

    这是阮一峰老师写的一个工具 ES-Checker,用来检查各种运行环境对 ES6 的支持情况.访问ruanyf.github.io/es-checker,可以看到您的浏览器支持 ES6 的程度.运行下 ...

  4. java----SAX解析XML

    XML: 可扩展标记语言 1.充当显示数据 2.储存数据 3.传输数据 SAX: 水电费 基于事假驱动,顺序读写,速度快 不能任意读取节点,灵活性差 解析时,占用内存小 import org.xml. ...

  5. hdu3652 数位dp记忆化搜索

    从未见过的船新版本数位dp,,省去了预处理过程,直接进行计算 #include<bits/stdc++.h> using namespace std; #define ll long lo ...

  6. 传输层的端口与TCP标志中的URG和PSH位

    一.协议端口号的提出 运输层提供了进程间通信的能力(即端-端通信).但是不同的操作系统可能无法识别其他机器上的进程.为了用统一的方法对 TCP/IP体系的应用进程进行标志,使运行不同操作系统的计算机的 ...

  7. centos查看系统/硬件信息及运维常用命令

    [root@yan-001 ~] # uname -a # 查看内核/操作系统/CPU信息的linux系统信息命令 [root@yan-001 ~] # head -n 1 /etc/issue # ...

  8. [原创]FPGA JTAG工具设计(二)

    经过前期打样 基于FT2232H的JTAG &UART板级已经初步形成 在Viado环境和ISE(13.2+)环境可以使用 速度支持10MHz/15MHz/30MHz 在ISE iMpact下 ...

  9. PHP游戏概率方法

    <?php function createRandomKey($randArr, $rateKey){ $total = 0; $chooseArr = array(); $pow = 0; / ...

  10. [C#]_[使用微软OpenXmlSDK (OpenXmlReader)读取xlsx表格] 读取大数据量100万条数据Excel文件解决方案

      1.OpenXmlSDK是个很好的类库,可惜只能通过C#调用,C#的童鞋又福气了. 2.服务端程序由于没法安装office,所以这个对asp.net网站来说是最理想的库了.需要.net 4.0版本 ...