类的继承 虚函数 纯虚函数

定义:

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);
}
posted @ 2024-07-13 09:13  Wzline  阅读(2)  评论(0编辑  收藏  举报