C++学习笔记 05 虚函数

一、虚函数的意义

虚函数引入了一种动态分配的概念,一般通过虚表(vtable)来实现编译。虚表就是一个包含所有虚函数映射的列表。通过虚表,我们可以在运行时找到正确的被重写的函数。简单来说,如果你想重写一个函数,那么你必须要把基类中的原函数设置为虚函数,否则父类引用调用的方法则是父类自身的方法,而不是根据创建实例的具体子类动态判断的。

二、虚函数的额外开销:

  1. 额外的内存来存储虚表,这样我们可以分配到正确的函数(父类指针指向哪种子类对象)
  2. 父类里有一个指针成员指向虚表。
  3. 每次调用虚函数的时候,必须要遍历续表去找到最终要运行的函数。
#include<iostream>
#include<string>

class Entity {
public:
	//std::string getName() {
	virtual std::string getName() {
		return "Entity";
	}
};

class Player : public Entity {
private:
	std::string m_Name;

public:
	Player(const std::string& name) {
		m_Name = name;
	}
	std::string getName() override {
		return m_Name;
	}
};


void printEntity(Entity* e) {
	std::cout << e->getName() << std::endl;
}


int main() {
	Entity* e = new Entity();
	printEntity(e); //Entity

	Player* p = new Player("Tom");
	printEntity(p); //Tom

	//父类引用指向子类对象,多态调用
	Entity* p1 = new Player("Jack");
	//父类此方法若有virtual 关键字,则调用子类的方法,否则调用父类的方法
	printEntity(p1);

	std::cin.get();
}

三、override 关键字

  1. c++ 11引入
  2. 编译期可以校验父类方法是否是虚函数
  3. 编译期可以校验子类方法名称是否正确

纯虚函数

本质与Java中的抽象方法或接口方法相同。原理上讲,纯虚函数允许我们定义一个在基类中没有实现的函数,然后强制子类中去实现这个函数。

四、纯虚函数

virtual std::string getName() = 0;

posted @ 2025-12-11 09:36  超轶绝尘  阅读(2)  评论(0)    收藏  举报