虚基类用法典题
一.一般用于基类指针指向派生类对象,利用设置基类函数为虚函数,访问派生类同名函数。
- 示例输入
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;
}
