继承
// class 派生类 : 访问修饰符 基类1, 访问修饰符 基类2...
class Animal
{
public:
int mAge;
virtual void speak()
{
cout<<"animal"<<endl;
}
};
class Sheep : public Animal
{
public:
string* mName;
Sheep(string name)
{
mName = new string("tom");
}
void speak()
{
cout<<"Sheep"<<endl;
}
};
class Tuo : public Animal
{
public:
void speak()
{
cout<<"Tuo"<<endl;
}
};
//多继承可能会导致菱形继承等混淆数据问题
//可以利用虚继承进行解决,使用virtual关键字在继承前,基类被称为虚基类
//这样派生类存储的是基类的虚基类指针所有子孙类共享一份数据
class SheepTuo : public Sheep, public Tuo
{
};
多态
class Calculator
{
//开闭原则:可以拓展,不能修改
public:
int mNum1;
int mNum2;
int getResult(string oper)
{
if("+" == oper)
{
return mNum1 + mNum2;
}else if("-" == oper)
{
return mNum1 - mNum2;
}else if("*" == oper)
{
return mNum1 * mNum2;
}else if("/" == oper)
{
return mNum1 / mNum2;
}
return 0;
}
private:
};
class AbstractCalculator
{
public:
int mNum1;
int mNum2;
//virtual type function(parameterList) = 0:
//只有函数的声明没有实现==》纯虚函数==》其他语言的接口
//具有纯虚函数的类是抽象类,无法进行实例化对象
//子类必须重写纯虚函数,因为继承了纯虚函数,不重写子类也是抽象类
virtual int getResult() = 0;
};
class AddCalculator : public AbstractCalculator
{
virtual int getResult()
{
return mNum1 + mNum2;
}
};
class SubCalculator : public AbstractCalculator
{
virtual int getResult()
{
return mNum1 - mNum2;
}
};
class MulCalculator : public AbstractCalculator
{
virtual int getResult()
{
return mNum1 * mNum2;
}
};
class DivCalculator : public AbstractCalculator
{
virtual int getResult()
{
return mNum1 / mNum2;
}
};
class AbstractDrinks
{
public:
virtual void Boil() = 0;
virtual void Brew() = 0;
virtual void PourInCup() = 0;
virtual void PutSomething() = 0;
void makeDrink()
{
Boil();
Brew();
PourInCup();
PutSomething();
}
};
class Coffee : public AbstractDrinks
{
virtual void Boil()
{
cout<<"Boil Coffee"<<endl;
}
virtual void Brew()
{
cout<<"Brew Coffee"<<endl;
}
virtual void PourInCup()
{
cout<<"PourInCup Coffee"<<endl;
}
virtual void PutSomething()
{
cout<<"PourInCup Coffee"<<endl;
}
};
class Tea : public AbstractDrinks
{
virtual void Boil()
{
cout<<"Boil Tea"<<endl;
}
virtual void Brew()
{
cout<<"Brew Tea"<<endl;
}
virtual void PourInCup()
{
cout<<"PourInCup Tea"<<endl;
}
virtual void PutSomething()
{
cout<<"PourInCup Tea"<<endl;
}
};
class Cpu
{
public:
virtual void cacl() = 0;
};
class Graphics
{
public:
virtual void disply() = 0;
};
class Memory
{
public:
virtual void storage() = 0;
};
class Computer
{
public:
Computer(Cpu* c, Graphics* g, Memory* m)
{
cpu = c;
gra = g;
mem = m;
}
void work()
{
cpu->cacl();
gra->disply();
mem->storage();
}
private:
Cpu* cpu;
Graphics* gra;
Memory* mem;
};
class IntelCpu : public Cpu
{
public:
virtual void cacl()
{
cout<<"IntelCpu"<<endl;
}
};
class IntelGraphics : public Graphics
{
public:
virtual void disply()
{
cout<<"IntelGraphics"<<endl;
}
};
class IntelMemory : public Memory
{
public:
virtual void storage()
{
cout<<"IntelMemory"<<endl;
}
};
class LenovoCpu : public Cpu
{
public:
virtual void cacl()
{
cout<<"IntelCpu"<<endl;
}
};
class LenovoGraphics : public Graphics
{
public:
virtual void disply()
{
cout<<"IntelGraphics"<<endl;
}
};
class LenovoMemory : public Memory
{
public:
virtual void storage()
{
cout<<"IntelMemory"<<endl;
}
};
void doSpeak(Animal& animal)
{
animal.speak();
}
/*void test01()
{
Sheep sheep;
doSpeak(sheep);
Tuo tuo;
doSpeak(tuo);
}*/
void test02()
{
cout<<"size animal: "<<sizeof(Animal)<<endl;
}
void test03()
{
Calculator c;
c.mNum1 = 10;
c.mNum2 = 10;
cout<<c.mNum1<<"+"<<c.mNum2<<"="<<c.getResult("+")<<endl;
cout<<c.mNum1<<"-"<<c.mNum2<<"="<<c.getResult("-")<<endl;
cout<<c.mNum1<<"*"<<c.mNum2<<"="<<c.getResult("*")<<endl;
cout<<c.mNum1<<"/"<<c.mNum2<<"="<<c.getResult("/")<<endl;
}
void test04()
{
//多态条件:基类的指针或者引用指向派生类的对象并且调用虚函数,动态绑定
AbstractCalculator* ac = new AddCalculator;
ac->mNum1 = 100;
ac->mNum2 = 100;
cout<<ac->mNum1<<"+"<<ac->mNum2<<"="<<ac->getResult()<<endl;
delete ac;
ac = new SubCalculator;
ac->mNum1 = 100;
ac->mNum2 = 100;
cout<<ac->mNum1<<"+"<<ac->mNum2<<"="<<ac->getResult()<<endl;
delete ac;
ac = new MulCalculator;
ac->mNum1 = 100;
ac->mNum2 = 100;
cout<<ac->mNum1<<"+"<<ac->mNum2<<"="<<ac->getResult()<<endl;
delete ac;
ac = new DivCalculator;
ac->mNum1 = 100;
ac->mNum2 = 100;
cout<<ac->mNum1<<"+"<<ac->mNum2<<"="<<ac->getResult()<<endl;
delete ac;
}
void doWork(AbstractDrinks* abs)
{
abs->makeDrink();
delete abs;
}
void test05()
{
doWork(new Coffee);
cout<<"---------------"<<endl;
doWork(new Tea);
}
void test06()
{
Cpu* intelCpu = new IntelCpu;
Graphics* intelGra = new IntelGraphics;
Memory* intelMem = new IntelMemory;
Computer* computer = new Computer(intelCpu, intelGra, intelMem);
computer->work();
delete computer;
}
int main()
{
test06();
system("pause");
system("cls");
return 0;
}