C++接口与实现的抽象分离
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++接口与实现的抽象分离的更多相关文章
- .NET Core CSharp初级篇 1-5 接口、枚举、抽象
.NET Core CSharp初级篇 1-5 本节内容类的接口.枚举.抽象 简介 问题 如果你需要表示星期或者是某些状态,使用字符串或者数字是否不直观? 你是否发现,无论何种电脑,它的USB口的设计 ...
- Mybatis mapper接口与xml文件路径分离
为什么分离 对于Maven项目,IntelliJ IDEA默认是不处理src/main/java中的非java文件的,不专门在pom.xml中配置<resources>是会报错的,参考这里 ...
- Jmeter接口测试之用例数据分离
之前我们的用例数据都是配置在 Jmeter Http 请求中,每次需要增加,修改用例都需要打开 jmeter 重新编辑,当用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢? ...
- unittest管理接口用例(数据分离-读取excel)
1.简单读取 #coding=utf-8 #调用封装好的excel读取公共方法 from python_API.common.ReadExcel import ReadExcel import req ...
- unittest 管理接口用例(数据分离-读取excel)
1.公共模块 ---> login.xls """ common (package) ---> ReadFile.py """ ...
- 多场景抢红包业务引发.NETCore下使用适配器模式实现业务接口分离
事情的起因 我们公司现有一块业务叫做抢红包,最初的想法只是实现了一个初代版本,就是给指定的好友单发红包,随着业务的发展,发红包和抢红包的场景也越来越多,目前主要应用的场景有:单聊发红包.群聊发红包.名 ...
- 从壹开始前后端分离[.NetCore] 37 ║JWT完美实现权限与接口的动态分配
缘起 本文已经有了对应的管理后台,地址:https://github.com/anjoy8/Blog.Admin 哈喽大家好呀!又过去一周啦,这些天小伙伴们有没有学习呀,已经有一周没有更新文章了,不过 ...
- Java面向对象理解_代码块_继承_多态_抽象_接口
面线对象: /* 成员变量和局部变量的区别? A:在类中的位置不同 成员变量:在类中方法外 局部变量:在方法定义中或者方法声明上 B:在内存中的位置不同 成员变量:在堆内存 局部变量:在栈内存 C:生 ...
- java===java基础学习(15)---抽象,接口
抽象 //这就是一个抽象类 abstract class Animal { String name; int age; abstract public void cry(); } //当一个类继承的父 ...
随机推荐
- keras系列︱Sequential与Model模型、keras基本结构功能(一)
引自:http://blog.csdn.net/sinat_26917383/article/details/72857454 中文文档:http://keras-cn.readthedocs.io/ ...
- Centos7 安装 tree
Centos7 安装 tree 用命令 yum 安装 tree yum -y install tree
- IDEA 在同一目录创建多个项目
以往的Eclipse.NetBeans等开发工具不同,IDEA的Project相当与Eclipse的Workspace,而Module相当于Project. 下边就给出Eclipse与IDEA的概念的 ...
- zabbix使用自动发现监控esxi的磁盘存储storage
zabbix使用自动发现监控esxi的磁盘存储storage 在任意一台可以访问vcenter的zabbix-agent服务器上添加exsi的磁盘监控模板即可 创建模板过程: custom.esxi. ...
- 【原创】大叔问题定位分享(4)Kafka集群broker节点从zookeeper上消失
kafka_2.8.0-0.8.1 一 现象 生产环境一组kafka集群经常发生问题,现象是kafka在zookeeper上的broker节点消失,此时kafka进程和端口都在,然后每个broker都 ...
- windows下安装setuptools与pip
1.下载 setuptools与pip 下载地址如下: https://pypi.Python.org/pypi/setuptools https://pypi.Python.org/pypi/pip ...
- Git使用六:版本对比
准备工作: 创建一个新的项目,并初始化git 创建两个文件,并写入对应内容(utf-8无bom格式) 执行git add 命令将两个文件添加到暂存区,执行commit命令提交到仓库并生产快照 修改工作 ...
- 在普通js文件里引入vue实例的方法
首先是我是写了一个 Loading 插件然后 是挂在打vue.prototype 原型上的. 在main.js中use使用了这个插件. 至此vue原型是就被我挂上 $loadding方法了. 然后我想 ...
- SqlServer中创建非聚集索引和非聚集索引
聚集索引与非聚集索引,其实已经有很多的文章做过详细介绍. 非聚集索引 简单来说,聚集索引是适合字段变动不大(尽可能不出现Update的字段).出现字段重复率小的列,因为聚集索引是对数据物理位置相同的索 ...
- leetcode目录
Leetcode 1. 数组 2. 动态规划 3. 字符串 4. 链表.双指针.排序 5. 树 6. 回溯算法.贪心算法.分治算法.