Makefile
SOURCE=$(wildcard ./*.cpp)
OBJ=$(patsubst %.o,%.cpp,$(SOURCE))
main:$(OBJ)
g++ $(OBJ) -g -o main
main.cpp
#include"iostream"
#include"Animal.h"
using namespace std ;
// test函数,需要一个animal类的地址
void test(Animal *animal)
{
// 执行animal的行为
animal->speak();
}
int main()
{
// 一个动物类指针保存了一个dog的地址,dog指向这个Dog类地址。
Animal *dog = new Dog("Chanby");
test(dog);
Animal *cat = new Cat("Kikey");
test(cat);
// animal指针指向的地址进行释放。
delete dog;
delete cat;
return 0;
}
Animal.h
#include"iostream"
#include"string"
using namespace std ;
// 这是一个Animal类。
class Animal{
protected:
// 动物名字属性。
string name;
public:
// 动物说话的行为指针,目前指向的地址为0;(vfptr)
virtual void speak()=0;
};
// dog类继承animal类的保护和公共权限的行为和属性。
class Dog:public Animal{
public:
// dog的构造函数,初始化 name 这个属性。
Dog(string name)
{
this->name=name;
// 父类中name是protected权限,但继承后是private权限。
}
// 多态,重写父类的speak函数,(把speak的地址给到父类的 virtual void speak()= void speak())
void speak();
};
class Cat:public Animal{
public:
Cat(string name)
{
this->name=name;
}
void speak();
};
Animal.cpp
#include"Animal.h"
#include"iostream"
#include"string"
using namespace std ;
// dog函数中的speak行为。
void Dog::speak()
{
// this指向的是dog类。
cout<<this->name+" is barball"<<endl;
}
void Cat::speak()
{
cout<<this->name+" is miaomiao"<<endl;
}