多态概念网上很多就不详细解释了,就是方便使用,和接口相似。
今天写多态的时候真的要疯了,对C的理解真是太垃圾了,根本不知道指针和地址怎么用。
遇到的最大的问题就是,抽象类不能直接实例化,必须指定指针,这卡了我好长时间,虽然主学逆向,但看来还得注重编程。
而且今天动摇了我的决心,发现护网太TM挣钱了,但是逆向却能让我沉浸其中,所以先学好逆向,再重拾渗透把。
下面给出今天写的代码,我在慢慢体会体会。
//老张开车去东北
#include<iostream>
#include<string>
using namespace std;
class Address
{
public:
string ad;
Address()
{
ad="东北"
}
Address(string d)
{
ad=d;
}
};
class Vehicle
{
public:
virtual void go(Address dest)=0;
};
class Car:public Vehicle
{
public:
void go(Address dest)
{
cout<<"坐车去"<<dest.ad<<endl;
}
};
class Train:public Vehicle
{
public:
void go(Address dest)
{
cout<<"坐火车去"<<dest.ad<<endl;
}
};
class Plain:public Vehicle
{
public:
void go(Address dest)
{
cout<<"坐飞机去"<<dest.ad<<endl;
}
};
class Driver
{
private:
string name;
public:
Address a;
Vehicle *v;
Driver(string n)
{
name=n;
}
void drive()
{
cout<<name;
v->go(a);
}
};
int main()
{
Driver p("老张");
Car c;
Plain pl;
Train t;
//car
p.v=&c;
p.drive();
//train
p.v=&t;
p.drive();
//plain
p.v=&pl;
p.drive();
return 0;
}
//小李打妖怪
#include<iostream>
#include<string>
#include<ctime>
using namespace std;
class Monster
{
private:
int HP;
string name;
public:
Monster(int h,string n)
{
HP=h;
name=n;
}
void Notify(int x)
{
HP=HP-x;
if(HP<=0)
cout<<name<<"已死!"<<endl;
else
cout<<name<<"已损失"<<x<<"血量!"<<endl;
}
};
class IAttackStrategy
{
public:
virtual void AttackTarget(Monster m)=0;
};
class WoodSword:public IAttackStrategy
{
public:
void AttackTarget(Monster m)
{
m.Notify(20);
}
};
class IronSword:public IAttackStrategy
{
public:
void AttackTarget(Monster m)
{
m.Notify(50);
}
};
class MagicSword:public IAttackStrategy
{
public:
void AttackTarget(Monster m)
{
srand( (unsigned)time( NULL ) );
int j =rand();
if(j%2==0)
m.Notify(100);
else{
cout<<"产生暴击!"<<endl;
m.Notify(200);
}
}
};
class Role
{
public:
IAttackStrategy *Weapon;
void Attack(Monster m)
{
Weapon->AttackTarget(m);
}
};
int main()
{
Monster m1(30,"a"),m2(60,"b"),m3(200,"c");
Role Li;
//木剑
WoodSword ws;
Li.Weapon=&ws;
Li.Attack(m1);
//铁剑
IronSword is;
Li.Weapon=&is;
Li.Attack(m2);
//魔剑
MagicSword ms;
Li.Weapon=&ms;
Li.Attack(m3);
return 0;
}