纯虚函数
纯虚函数:是一个在基类中声明的虚函数,没有定义具体的操作,需要各派生类(子类)根据实际需要给出各自的定义!
c++中虚函数和抽象函数在本质上基本相同!
注意的是,无法实例化!
通常被叫做接口的东西 interfaces,里面仅仅包含未实现的方法,实际上无法实例化
纯虚函数与一般虚函数的区别就是,摆脱身体,取而代之!
virtual std::string GetName() = 0;
对应的无法进行实例化:Enitity * e = new Enitity();
报错!
相应的变化为:Enitity * e = new Player(" ");
Player是Enitity的一个子类 ,但是当我们将子类Player中的虚函数注释掉以后,会报错!
错误(活动) E0322 不允许使用抽象类类型 “Player” 的对象: test
补充,什么叫做接口interfaces:
void Print(? ? ? obj)
{
std::cout << obj->GetClassName() << std::endl;
}
拿这个为例子:
obj->GetClassName 在这里我们实际上需要的是一种可以确保我们有一个GetClassName的函数的类型,需要提供一个类型来提供这个Get函数!
以下是完整的测试代码!
#include <iostream>
#include <string>
//调用它作为接口
class Printable
{
public:
virtual std::string GetClassName() = 0;
};
class Enitity : public Printable
{
public:
virtual std::string GetName() {return "Entity";}
std::string GetClassName() override { return "Entity"; }
};
class Player : public Enitity,Printable
{
private:
std::string m_Name;
public:
Player(const std::string& name)
:m_Name(name) {}
std::string GetClassName() { return "Player"; }//适当的打印出了Player而不是Cherno
std::string GetName() override { return m_Name; }
};
void Print(Printable* obj) //必须改为指针类型!因为通过指针或者引用,才可以指向并且访问子类的对象
{
std::cout << obj->GetClassName() << std::endl;
}
int main()
{
Enitity * e = new Enitity();
//PrintName(e);
Player * p = new Player("Cherno");
//PrintName(p);
Print(e); //也可以摆脱Printable,调用Print实现!
Print(p);
std::cin.get();
}
打印出的是Entity Player