动态多态

与继承中限定让父类参与但可以带入子类的方法一致
地址软绑定,由输入的决定

class father
{
public:
virtual void speak()
{
cout<<"father!";
}
};
class son:public father
{
public:
void speak()
{
cout<<"son!";
}
};
void spk(father &f)
{
f.speak();
}
int main()
{
son s;
spk(s);
}

如此,要满足:1.包含继承 2.重写父类函数
使用时形参为父类的引用/指针

虚函数的用法

//可将整体的类拆分,方便后续的修改和添加
class father
{
public:
virtual void speak()
{
cout<<"father!";
}
};
class son1:public father
{
public:
void speak()
{
cout<<"son1!";
}
};
class son2:public father
{
public:
void speak()
{
cout<<"son2!";
}
};
int main()
{
father * a=new son1;
a->speak();
a=new son2;
a->speak();
delete a;//指针类写法
}
//如上,可随时增添子类

纯虚函数

//虚析构
class father
{
public:
virtual void speak()=0;
};
class son1:public father
{
public:
void speak()
{
cout<<"son1!";
}
};
class son2:public father
{
public:
void speak()
{
cout<<"son2!";
}
};
int main()
{
father * a=new son1;
a->speak();
a=new son2;
a->speak();
delete a;
}
//将father转化为纯虚函数后只能通过赋值的形式得到father的对象
//其子类必须重写该虚函数
//抽象类:只作为接口和过渡,用指针接收后调用对应的接口,如
class cc
{
public
virtual int caclute()
{
return 0;
}
}
class cb:public cc;
class cbpublic cc;

纯虚析构函数

class father
{
public:
father ()
{
cout<<"大的活了"<<endl;
}
virtual ~father()=0;
virtual void speak()=0;
};
class son1:public father
{
public:
void speak()
{
cout<<"son1!";
}
son1 ()
{
cout<<"小的活了"<<endl;
}
~son1()
{
cout<<"小的似了"<<endl;
}
};
father::~father()
{

}//纯虚析构必须要补定义
int main()
{
father * a=new son1;
a->speak();
delete a;
}