类的继承 虚函数 纯虚函数
定义:
class TIme:public Ent//Ent Time 是Ent的子集 继承Ent类的公开变量
//Time 可共享Ent ,Ent不能共享Time类
虚函数:
功能:
允许在子类中重写方法 也就是本例子中的Time类中,在Ent类中重写virtual让它做其他事情
例如:
class Ent
{
public:
virtual std::string Getname() { //虚拟函数 子类中重写方法 告诉编译器建立一个V表
//若是该函数被重写了,你可以指向正确的函数,
//因为基类和继承类中方法名字相同 不知道指哪个方法,
//用了虚函数可以避免,能明确知道用哪个类中的函数。
return "Ent";
}
};
class Time:public Ent//继承Ent类
{
private:
std::string m_name;
public:
Time(const std::string& name)//可输入名字
:m_name(name)
{
}
std::string Getname() override //override写不写都行 最好写上 能避免前面的函数名拼写错误
{
return m_name;
}
};
void print(Ent* entity)
{
std::cout << entity->Getname() << std::endl;
}
int main()
{
Ent e;
Time b("ss");
print(&b);
print(&e);//没用virtual前 两个结果都是都是用Ent中的方法;
}
V表
是什么:是一个表结构,包含基类中所有的 虚函数 的映射,在基类中的虚函数运行时把它们映射到正确的
复写(override)函数。
条件:若想要复写一个函数必须将基类中的奇函数标记为虚函数(前面加virtual)
虚拟函数工作原理
:会建立一个v表 包括基类中有个指针指向V表 每次调用虚函数时
都要遍历这个表,来确定映射到哪个函数
纯虚函数
是什么:
一种特殊类型的虚函数 本质与其他语言的接口相同或抽象方法
作用:
允许在基类中定义一个未实现的方法,然后强制子类去实际实现它们;
什么时候用:
如果确保类都有一个特定的方法 ,可以将这个类作为参数放入一个通用函数中,可以调用这个方法或者做其他事情。
创建一个类 里面都是未实现的方法,强制子类去实现方法的功能——接口
所以类的接口只包含未实现的方法 作为模版 因为该接口不包含方法实现,所以我们不可能实例化那个类(接口类);
代码示例:
class printable
{
public:
virtual std::string getname() = 0;
};
class Entity: public printable
{
public:
std::string getname()override
{
return "Ent";
}
};
class player:public Entity,printable
{
private:
std::string m_name;
public:
player(const std::string& name)//可输入名字
:m_name(name)
{
}
std::string getname() override
{
return m_name;
}
};
void print( printable* obj)//传入接口 里面有各种方法
{
std::cout << obj->getname() << std::endl;//堆接口里的方法进行具体操作
}
int main()
{
Entity* entity=new Entity();
print(entity);
}