/*
实现同接口下不同类的对象的转移
定义类的接口
定义多个继承该接口的类
定义管理类,把接口当作类型,
传入该接口下各种类的对象,进行操作
*/
#include<iostream>
#include<map>
#include<cstdlib>
using namespace std;
template<typename keyType,typename valueType>
struct Node{
keyType key;
valueType value;
Node *next;
};
template<typename keyType,typename valueType>
class List
{
public:
List()
{
tail=accom=mallocmemory();//initialize head node
}
void Add(keyType key,valueType value){
Node<keyType,valueType> *nd=mallocmemory();
nd->key=key;
nd->value=value;
tail->next=nd;
tail=tail->next;
}
valueType Get(keyType key,bool del=false)
{
Node<keyType,valueType> *record,*temp=accom->next;
valueType t;
while(temp!=NULL&&temp->key!=key)
{
temp=temp->next;
}
t=temp->value;
if(del)
{
record=accom;
while(record->next!=temp)
record=record->next;
record=temp->next;
free(temp);
}
return t;
}
bool Exist(keyType key)
{
Node<keyType,valueType> *temp=accom->next;
while(temp!=NULL&&temp->key!=key)
{
temp=temp->next;
}
if(temp==NULL)
return false;
return true;
}
valueType RemoveById(keyType id)
{
return Get(id,true);
}
private:
Node<keyType ,valueType> *mallocmemory(){
Node<keyType,valueType> *nd=(Node<keyType,valueType>*)malloc(sizeof(Node<keyType,valueType>));
nd->next=NULL;
return nd;
}
Node<keyType,valueType> *accom,*tail;
};
class IPerson{
public:
virtual void SetName(string name)=;
virtual void SetAge(int age)=;
virtual void ShowInfo()=;
};
class Student:public IPerson
{
public:
void SetName(string name)
{
Name=name;
}
void SetAge(int age)
{
Age=age;
}
void ShowInfo()
{
cout<<"学生信息:"<<endl;
cout<<"\tName: "<<Name<<endl;
cout<<"\tAge : "<<Age<<endl;
}
private:
string Name;
int Age;
};
class Parent:public IPerson
{
public:
void SetName(string name)
{
Name=name;
}
void SetAge(int age)
{
Age=age;
}
void ShowInfo()
{
cout<<"家长信息:"<<endl;
cout<<"\tName: "<<Name<<endl;
cout<<"\tAge : "<<Age<<endl;
}
private:
string Name;
int Age;
};
class Teacher:public IPerson
{
public:
void SetName(string name)
{
Name=name;
}
void SetAge(int age)
{
Age=age;
}
void ShowInfo()
{
cout<<"老师信息:"<<endl;
cout<<"\tName: "<<Name<<endl;
cout<<"\tAge : "<<Age<<endl;
}
private:
string Name;
int Age;
};
class Manager{
public:
Manager()
{
curPer=NULL;
}
void SetName(string name)
{
curPer->SetName(name);
}
void SetAge(int age)
{
if(curPer==NULL)cout<<"农夫"<<endl;
else
curPer->SetAge(age);
}
void ShowInfo()
{
curPer->ShowInfo();
}
void AddPeople(int id,IPerson *person)
{
per.Add(id,person);
}
void ChangeState(int id)
{
if(per.Exist(id))
curPer=per.Get(id);
else
cout<<"没有找到这个栈"<<endl;
}
private:
List<int,IPerson*> per;
IPerson *curPer;
};
int main()
{
Parent one;
Student stu;
Teacher tea;
Manager manage;
manage.AddPeople(,&one);
manage.AddPeople(,&stu);
manage.AddPeople(,&tea); manage.ChangeState();
manage.SetAge();
manage.SetName("jiazhang"); manage.ChangeState();
manage.SetAge();
manage.SetName("xuesheng"); manage.ChangeState();
manage.SetAge();
manage.SetName("laoshi");
for(int i=;i>;i--) {
manage.ChangeState(i);
manage.ShowInfo();} return ;
}

C++下实现同接口下多个类作为参数的调用和传参的更多相关文章

  1. C#进阶系列——WebApi 接口参数不再困惑:传参详解

    前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望能帮初学者少走弯路.本 ...

  2. WebApi 接口参数不再困惑:传参详解

    阅读目录 一.get请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4.“怪异”的get请求 二.post请求 1.基础类型参数 2.实体作为参数 3.数组作为参数 4.后台发送请求参数的 ...

  3. 【转】C#进阶系列——WebApi 接口参数不再困惑:传参详解

    原文地址:http://www.cnblogs.com/landeanfen/archive/2016/04/06/5337072.html 阅读目录 一.get请求 1.基础类型参数 2.实体作为参 ...

  4. C#WebApi 接口参数不再困惑:传参详解

    前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望能帮初学者少走弯路.本 ...

  5. [转]C#进阶系列——WebApi 接口参数不再困惑:传参详解

    本文转自:http://www.cnblogs.com/landeanfen/p/5337072.html#_label1_2 阅读目录 一.get请求 1.基础类型参数 2.实体作为参数 3.数组作 ...

  6. sC#进阶系列——WebApi 接口参数不再困惑:传参详解

    原文:http://www.cnblogs.com/landeanfen/p/5337072.html 一.get请求 对于取数据,我们使用最多的应该就是get请求了吧.下面通过几个示例看看我们的ge ...

  7. (转)C# WebApi 接口参数不再困惑:传参详解

    原文地址:https://www.cnblogs.com/landeanfen/p/5337072.html 本篇打算通过get.post.put.delete四种请求方式分别谈谈基础类型(包括int ...

  8. 踩坑记录--接口调用,传参DataTable报错

    问题描述 服务端提供接口,接口参数包含DataTable类型,客户端调用显示请求报错,Postman调用显示Could not get response 解决 原因 接口实现基于wcf,而wcf参数类 ...

  9. 2016/1/21 练习 创建 接口interface 应用implements 类class 并实例化调用

    package testinterface; public interface ICpu { //电压 public boolean dianya(); //控制 public void kongzh ...

随机推荐

  1. Django_用户权限管理rbac

    组成部分 1.初始化权限:login视图initial_permission,把权限信息放入session.initial_permission函数生成权限列表.菜单列表 2.中间件验证权限:在第一次 ...

  2. oracle数据update后怎么恢复到以前的数据

    http://blog.csdn.net/itdada/article/details/52746392

  3. 第二阶段Sprint冲刺会议3

     进展:讨论视频录制的具体功能,查看有关资料,开始着手编写有关代码.

  4. c++中的函数重载

    函数多态也称为函数重载. (1)函数重载指的是可以有多个同名的函数,因此对名称进行了重载. (2)函数重载的关键在于函数的参数列表,也称为函数特征标.如果两个函数的参数数目和参数类型相同,同时参数的排 ...

  5. Java大数——快速矩阵幂

    Java大数——快速矩阵幂 今天做了一道水题,尽管是水题,但是也没做出来.最后问了一下ChenJ大佬,才慢慢的改对,生无可恋了.... 题目描述: 给a,b,c三个数字,求a的b次幂对c取余. 数据范 ...

  6. quartusII13.0使用教程

    1.新建工程项目,填写项目存储路径和工程名,不要出现中文路径 2.添加已存在文件(可选),在[File name]下选择已经存在的工程项目,利用[Add]或[Add all]命令添加文件到新工程,点击 ...

  7. C# 通过http post 请求上传图片和参数

    一.C# Winform或控制台 /// <summary> /// 通过http上传图片及传参数 /// </summary> /// <param name=&quo ...

  8. Alpha阶段敏捷冲刺⑥

    1.提供当天站立式会议照片一张. 每个人的工作 (有work item 的ID),并将其记录在码云项目管理中: 昨天已完成的工作. 实现对账单条目的编辑 初步设计设置页面 今天要完成的工作. 账单明细 ...

  9. 字符串拆分函数 func_splitstr

    create type str_split is table of varchar2(4000) ; 1 CREATE OR REPLACE FUNCTION splitstr(p_string IN ...

  10. SPOJ_LCS

    经典题目,求两个串的最长公共子串. 是这样来做的. 以第一个串构造SAM,第二个串在自动机上跟新一遍就可以了. 更新的过程是这样的,假设当前到达的状态点为x(初始状态为0点),下一个字符是c,如果当前 ...