【Cherno C++】继承、虚函数、纯虚函数(接口)

113 阅读1分钟

继承

**//父类
class Person
{
public:
	int age, height;

	void sayHello()
	{
		std::cout << "你好啊" << std::endl;
	}
};

//子类继承父类
class Man : public Person
{

public:
	void sayBye() 
	{
		std::cout << "再见" << std::endl;
	}
};

int main()
{
	Man man;
	//子类可以调用父类的属性
	man.age = 10;
	man.height = 175;
	man.sayHello();
	std::cout << man.age << std::endl;
	std::cout << man.height << std::endl;
	man.sayBye();

	//控制台打印
	//你好啊
	//10
	//175
	//再见
	std::cin.get();
}**

虚函数virtual

在父类的方法中,正确的使用虚函数修饰,子类覆写父类的方法的时候,才能正确的找到子类的覆写方法。

//virtual虚函数允许在子类重写方法  
class Entity
{
public:
	//std::string GetName() { return "Entity"; }

	// 添加虚函数标记
	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 PrintName(Entity* entity)
{
	std::cout << entity->GetName() << std:: endl;
}

int main()
{
	Entity* e = new Entity();
	PrintName(e);

	Player* p = new Player("Cherno");
	PrintName(p);

	//Entity
	//Cherno

	//如果在多态下打印都是Entity
	Entity* entity = p;
	PrintName(entity);

	//虚函数通过虚函数表映射到正确的覆写函数 override
	//Entity
	//Cherno
	//Cherno
	//使用virtual标记  能正确的找到子类的覆写方法
	//所以子类要覆写父类的函数,要将弗雷德函数改为虚函数

	std::cin.get();
}

纯虚函数

纯虚函数允许我们在基类中定义一个没有实现的函数,然后强制子类去实现该函数。

类似于java中的接口的概念,c++没有接口,都是类。在类中使用纯虚函数定义模板,通过子类去实现方法定义。

//纯虚函数允许我们在基类中定义一个没有实现的函数,然后强制子类去实现该函数
class Printable
{
public:
	virtual std::string GetClassName() = 0;
};

class Entity : public Printable
{
public:
	virtual std::string GetName() { return "Entity"; }
	std::string GetClassName() override { return "Entity"; }
};

class Player : public Entity,public Printable
{
private: 
	std::string m_Name;
public:
	Player(const std::string name)
		: m_Name(name) {}
	
	std::string GetName() override { return m_Name; }
	std::string GetClassName() override { return "Player"; }
};

void Print(Printable* obj)
{
	std::cout << obj->GetClassName() << std::endl;
}


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

	Player* p = new Player("Cherno");

	Print(e);
	Print(p);
	std::cin.get();
}