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(); } //当一个类继承的父 ...
随机推荐
- poj100纪念
- Spring+Shiro的踩坑
今天想给某个Service的某些方法添加Cache,这个记为A,用的springboot,照常在方法上加上Cacheable注解,测试缓存生效,搞定.然后再在第二个Service,记为B,添加Cach ...
- Oracle 自定义函数、存储过程
讲函数之前,先介绍一下程序结构 3.程序结构 新建一个测试窗口,举一个小例子 declare -- 声明变量,包括游标 begin -- 执行部分 dbms_output.put_line('hell ...
- 移动端bug集合
移动端软键盘遮挡输入框&IOS移动端点击输入框字体放大&IOS点击闪烁 移动端软键盘遮挡输入框 ——> 转载自: https://www.jb51.net/article/1 ...
- Vue导出json数据到Excel表格
一.安装依赖 npm install file-saver --save npm install xlsx --save npm install script-loader --save-dev 二. ...
- PHP 【三】
字符串变量 $txt = "Hello world!"; 创建字符串后,就可以对它操作,可以在函数中使用,或者把它存储在变量中 并置运算符 [把两个字符串值连接起来] <?p ...
- poj 2155 matrix 二维线段树 线段树套线段树
题意 一个$n*n$矩阵,初始全为0,每次翻转一个子矩阵,然后单点查找 题解 任意一种能维护二维平面的数据结构都可以 我这里写的是二维线段树,因为四分树的写法复杂度可能会退化,因此考虑用树套树实现二维 ...
- C++设计模式——组合模式
问题描述 上图,是一个公司的组织结构图,总部下面有多个子公司,同时总部也有各个部门,子公司下面有多个部门.如果对这样的公司开发一个OA系统,作为程序员的你,如何设计这个OA系统呢?先不说如何设计实现, ...
- C#+EntityFramework编程方式详细之Code First
Code First Code First模式即“代码优先”模式,是从EF4.1开始新建加入的功能.使用Code First模式进行EF开发时只需要编写对应的数据类,然后自动生成数据库. Code F ...
- vue脚手架安装步骤vue-cli
1.环境搭建 安装node.js: 从node.js官网下载并安装node,安装过程很简单. npm 版本需要大于 3.0,如果低于此版本需要升级它: # 查看版本 $ npm -v 2.3 ...