基本概念
#include <iostream>
#include <string>
using namespace std;
//抽象类,无法实例化对象。
class Animal {
public:
//3.通过加virtual关键字使其变虚函数。
virtual void talk() { cout << "Animal is talking " << endl; }
};
class Dog:public Animal {
public:
void talk() { cout << "Dog is talking" << endl; }
};
class Pig:public Animal {
public:
void talk() { cout << "Pig is talk" << endl; }
};
//1.在编译阶段,已确定函数地址为animal了。
//3.1在运行阶段,因为有了virtual修饰,vfptr就在vfptb表中修改确定成传入的对象函数地址了。
void Mainwork(Animal& animal){ animal.talk(); }
int main() {
Dog d;
//2.所以此刻只打印Animal类中的talk方法。
Mainwork(d);
//3.2在加virtual后,此时就能打印Dog的talk方法了
Pig p;
Mainwork(p);
return 0;
}
纯虚函数和抽象类
#include <iostream>
using namespace std;
class Base {
public:
virtual void func() = 0;
};
class Son:public Base {
public:
virtual void func() {};//子类重写父类纯虚函数,才能实例化对象
};
int main() {
//Base b;//无法实例化对象
Son s;//子类重写父类纯虚函数,才能实例化对象
return 0;
}
虚析构和纯虚析构
#include <iostream>
using namespace std;
//通过虚析构和纯虚析构才能走到子类的析构。
/*
用来解决通过父类指针释放子类对象;
如果子类没有堆区数据。就用不着它们;
拥有纯虚析构函数的类也属于抽象类;
*/
class Animal {
public:
virtual void speak() = 0;
//virtual ~Animal() {};//1.至为虚析构。才会走~Dog析构。
virtual ~Animal() = 0;//2.纯虚析构声明。
};
Animal::~Animal() {};//2.1纯虚析构定义。才会走~Dog析构。
class Dog:public Animal{
public:
Dog(string name) {
d_name = new string(name);
}
virtual void speak() { cout << *d_name<<" DOG SPEAKING!\n"; }
string *d_name;
~Dog() {
if (d_name !=NULL)
{
cout<< *d_name<<"is gone"<<endl;
delete d_name;
}
};
};
void work(Animal* aml) {
aml->speak();
delete aml;
};
int main() {
work(new Dog("LUCS"));
return 0;
}
多态应用案例
#include <iostream>
using namespace std;
//抽象类
class ABstractDrink {
public:
virtual void Boil() = 0;
virtual void Brew() = 0;
virtual void Pourincup() = 0;
virtual void PutAnother() = 0;
void makeDrink() {
Boil();
Brew();
Pourincup();
PutAnother();
cout << "Finished!" << endl;
};
};
class Coffee :public ABstractDrink {
public:
virtual void Boil() { cout << "boil coffee \n"; };
virtual void Brew() { cout << "brew coffee \n"; };
virtual void Pourincup() { cout << "pour in coffee \n"; };
virtual void PutAnother() { cout << "put in coffee \n"; };
};
class Milk :public ABstractDrink {
public:
virtual void Boil() { cout << "boil Milk \n"; };
virtual void Brew() { cout << "brew Milk \n"; };
virtual void Pourincup() { cout << "pour in Milk \n"; };
virtual void PutAnother() { cout << "put in Milk \n"; };
};
void work(ABstractDrink* abs) {
abs->makeDrink();
delete abs;
};
int main() {
work(new Coffee);
work(new Milk);
return 0;
}
多态应用案例二-做电脑
#include <iostream>
#include <string>
using namespace std;
//零件
class CPU{
public:
virtual void run() =0;
};
class GPU{
public:
virtual void display() = 0;
};
class Memory{
public:
virtual void storge() = 0;
};
//厂商
class AMD:public CPU{
public:
virtual void run() {
cout <<"Cpu running...." << endl;;
}
};
class NIVADA :public GPU {
public:
virtual void display() {
cout << "Gpu displayed" << endl;
}
};
class Kinston :public Memory {
public:
virtual void storge() {
cout << "memory storged" << endl;
}
};
//实体
class PC{
public:
PC(CPU* cpu, GPU* gpu, Memory* memory) {
ccpu = cpu;
ggpu = gpu;
mmemory = memory;
};
void made() {
cout << "making Computer !!!!" << endl;
ccpu->run();
ggpu->display();
mmemory->storge();
};
~PC() {
if (ccpu!=NULL && mmemory!=NULL && ggpu!=NULL)
{
delete ccpu; delete ggpu, delete mmemory;
cout << "Computer made" << endl;
}
};
private:
CPU* ccpu;
GPU* ggpu;
Memory* mmemory;
};
int main() {
CPU* amd = new AMD;
GPU* nivada = new NIVADA;
Memory* memory = new Kinston;
PC* pc = new PC(amd, nivada, memory);
pc->made();
delete pc;
return 0;
}