虚基类用法典题

虚基类用法典题

一.一般用于基类指针指向派生类对象,利用设置基类函数为虚函数,访问派生类同名函数。

在这里插入图片描述

  • 示例输入
    4
    Tiger Jumpjump 10
    Pig Piglet 4
    Rabbit labi 3
    Duck tanglaoya 8
  • 示例输出
    Hello,I am Jumpjump,AOOO.
    Hello,I am Piglet,HENGHENG.
    There is no Rabbit in our Zoo.
    Hello,I am tanglaoya,GAGA.
#include <iostream>
#include <cstring>
using namespace std;
class Animal{
protected:
	char *name;
	int age;
public:
	Animal(char *n, int a){
		name = new char[20];
		strcpy(name, n);
		age = a;
	}
	virtual void speak() = 0;   //设置纯虚函数
	~Animal(){
		delete [] name;
	}
};
class Tiger: public Animal{
public:
	Tiger(char *n, int a):Animal(n, a){ }
	void speak(){
		cout << "Hello,I am " << name << ",AOOO." << endl;
	}
	
};
class Dog: public Animal{
public:
	Dog(char *n, int a):Animal(n, a){ }
	void speak(){
		cout << "Hello,I am " << name << ",WangWang." << endl;
	}
};
class Duck: public Animal{
public:
	Duck(char *n, int a):Animal(n, a){ }
	void speak(){
		cout << "Hello,I am " << name << ",GAGA." << endl;
	}
};
class Pig: public Animal{
public:
	Pig(char *n, int a):Animal(n, a){ }
	void speak(){
		cout << "Hello,I am " << name << ",HENGHENG." << endl;
	}
};
int main()
{
	int t;
	cin >> t;
	while(t--)
	{
		char ch[20];
		char n[20];
		int a;
		cin >> ch >> n >> a;
		Animal *pa;
		if(strcmp(ch,"Tiger")==0)
		{
			Tiger t(n, a);
			pa = &t;
			pa->speak(); 
		}
		else if(strcmp(ch,"Dog")==0)
		{
			Dog d(n, a);
			pa = &d;
			pa->speak();
		}
		else if(strcmp(ch,"Duck")==0)
		{
			Duck dc(n, a);
			pa = &dc;
			pa->speak(); 
		}
		else if(strcmp(ch,"Pig")==0)
		{
			Pig p(n, a);
			pa = &p;
			pa->speak();
		}
		else
			cout << "There is no " << ch << " in our Zoo." << endl;	
	}
	return 0;
}
二.利用基类的引用,并设置基类函数为虚函数,访问派生类同名函数。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 示例输入
    1111 A 100
    2222 B 200 0
    3333 C 300 3000
    49 -51 -100 50
    100 150 500 55
    300 200 2000 5000
  • 示例输出
    1111-A-99
    2222-B-95-55
    3333-C-0-1400
#include <iostream>
using namespace std;
//类定义
class Card{
protected:
    int ID, Counter;
    char CName;
public:
    void initial(int id, char cname, int counter);
    int save(int money);
    int take(int money);
    virtual void info();
};
class TCard: public Card{
private:
    int Tcounter;
public:
    void initial(int id, char cname, int counter, int tcounter);
    int transfer(int money);
    void info();
};
class VCard: public Card{
private:
    int Credit;
public:
    void initial(int id, char cname, int counter, int credit);
    int over(int money);
    void info();
};
//类实现
void Card::initial(int id, char cname, int counter){
    ID = id;
    CName = cname;
    Counter = counter;
}
int Card::save(int money) {
    if(money <= 0)
        return -1;
    Counter += money;
    return 1;
}
int Card::take(int money) {
    if(money <= 0 || money > Counter)
        return -1;
    Counter -= money;
    return 1;
}
void Card::info() {
    cout << ID << "-" << CName << "-" << Counter << endl;
}
void TCard::initial(int id, char cname, int counter, int tcounter) {
    ID = id;
    CName = cname;
    Counter = counter;
    Tcounter = tcounter;
}
int TCard::transfer(int money) {
    if(money <= 0 || money > Counter)
        return -1;
    Counter -= money;
    Tcounter += money;
    return 1;
}
void TCard::info() {
    cout << ID << "-" << CName << "-" << Counter << "-" << Tcounter << endl;
}
void VCard::initial(int id, char cname, int counter, int credit) {
    ID = id;
    CName = cname;
    Counter = counter;
    Credit = credit;
}
int VCard::over(int money) {
    if(money <= 0 || money > Counter+Credit)
        return -1;
    else if(money > Counter)
    {
        Credit = Credit-(money-Counter);
        Counter = 0;
    }
    else
        Counter -= money;
    return 1;
}
void VCard::info() {
    cout << ID << "-" << CName << "-" << Counter << "-" << Credit << endl;
}
void show(Card &obj)    //传入基类的引用
{
    obj.info();
}
//主函数
int main()
{
    int id, counter, tcounter, credit, m1, m2, m3, m4;
    char cname;
    cin >> id >> cname >> counter;
    Card c;
    c.initial(id, cname, counter);
    cin >> id >> cname >> counter >> tcounter;
    TCard t;
    t.initial(id, cname, counter, tcounter);
    cin >> id >> cname >> counter >> credit;
    VCard v;
    v.initial(id, cname, counter, credit);
    cin >> m1 >> m2 >> m3 >> m4;
    c.save(m1);
    c.save(m2);
    c.take(m3);
    c.take(m4);
    cin >> m1 >> m2 >> m3 >> m4;
    t.save(m1);
    t.take(m2);
    t.transfer(m3);
    t.transfer(m4);
    cin >> m1 >> m2 >> m3 >> m4;
    v.save(m1);
    v.take(m2);
    v.over(m3);
    v.over(m4);
    show(c);
    show(t);
    show(v);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X to Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值