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(); } //当一个类继承的父 ...
随机推荐
- npm cnpm yarn
npm 如何下载指定版本的组件 先确保文件目录下含有 package.json 文件, 没有的话,可以通过 npm init 创建, 然后只需要在组件的后面加上 @2.8.1 版本号即可, 例如:re ...
- webpack学习笔记——打包后直接访问页面,图片路径错误
我说的这种图片路径错误是这样的,运行webpack-dev-server,一切正常,没有错误.当webpack之后,直接打开index页面,报错,图片找不到,找不到的原因是路径错误. 先看我的项目代码 ...
- oracle建表 和 设置主键自增
1.新建table CREATE TABLE ysb_log( id ) primary key not null , tbdate ) NULL, tb_time ) NOT NULL, tblog ...
- C#处理非托管资源
using System; //处理非托管资源 //例如:文件句柄.网络连接.数据库连接 //实现IDisposable不意味着也应该实现一个终结器,终结器会带来额外开销 //发布本机资源,要释放本机 ...
- 使用tablayout和recyclerview的时候,报重复添加Fragment错误
原因: 在添加的子Fragment报错了, 出现了空值错误, 此时报出来错误是前一个Fragment重复添加
- javascript基础 之 代码规范
1,变量名 1,变量名推荐使用小驼峰写法:类似于:firstName 2,全局变量和常量建议用大写:PI 3,支持下划线 2,缩进 1,一般使用4个空格当作缩进,tab建议少用 2,运算符左右和左花括 ...
- python的request包
1,request包基本用法 import requests a=requests.get("http://www.baidu.com")print a.text #以文本形式打印 ...
- 关于Linux的随笔笔记
1.Ctrl+c.Ctrl+z和Ctrl+d的区别: Ctrl+c和Ctrl+z都是中断命令,但是他们的作用却不一样: Ctrl+c 是向当前进程发送SIGINT信号,用于终止进程: Ctrl+z 是 ...
- 根据SQL_ID查询并杀会话
Oracle 根据SQL_ID查询并杀会话,清空执行计划缓冲池2018年09月06日 10:31:40 小学生汤米 阅读数:4731. 查询最近五分钟内最高频次SQL,查看event select t ...
- python3 基础语法(一)
一.标识符: 第一个字符必须是字母表中字母或下划线 “_” . 例如: #!/usr/bin/env python #coding=utf-8 a = 3 _aa = 3 a3 = 3 _aa3 = ...