首页 > 编程语言 >C++学习

C++学习

时间:2024-09-25 20:21:59浏览次数:3  
标签:std string GetName C++ Entity 学习 纯虚 public

1、纯虚函数

纯虚函数本质上与其他语言(如Java,C#)中的抽象方法或接口相同。

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

在面向对象中,创建一个类,只由未实现的方法组成,然后强制子类去实际实现它们,这非常常见,这通常被称为接口。因此,类中的接口只包含未实现的方法,作为模板。由于这个接口类实际上并不包含方法实现,我们实际上不可能实例化那个类

注意:以下代码与前一篇博文的代码相比有改动,主要是Entity类中的虚函数写成=0了,那么本质上就是一个纯虚函数了。

#include<iostream>

class Entity
{
public:
	std::string GetName() = 0;  //去掉方法体,写成等于0,这里virtual表示仍然是一个虚函数,但是本质上写成等于0就使得它成为一个纯虚函数,这意味着它必须在一个子类中实现
};
void PrintName(Entity* Entity)
{
	std::cout << Entity->GetName() << std::endl;
}
class Player : public Entity
{
private:
	std::string m_Name;
public:
	Player(const std::string& name)
		: m_Name(name){}

	std::string GetName(){ return m_Name; }
};
int main()
{
	//Entity* e = new Entity();//我们不再具有实例化Entity类的能力,我们必须给它一个子类,来实现这个函数,这种情况下,当然是Player类
    Entity* e = new Player("")  //当然这里需要提供一些字符串
	//std::cout << e->GetName() << std::endl;
	PrintName(e);

	Player* p = new Player("Cherno");
	//std::cout << p->GetName() << std::endl;
	PrintName(p);

	std::cin.get();
}

纯虚函数必须被实现,才能创建这个类的实例

(接口只是C++的类而已)

#include<iostream>

class Printable
{
public:
    std::string GetClassName() = 0;
}

class Entity : public Printable
{
public:
	//std::string GetName(){ return "Entity"; }
    std::string GetClassName() override {return "Entity"};
};
void PrintName(Entity* Entity)
{
	std::cout << Entity->GetName() << std::endl;
}
class Player : public Entity , Printable
{
private:
	std::string m_Name;
public:
	Player(const std::string& name)
		: m_Name(name){}

	//std::string GetName(){ return m_Name; }
    std::string GetClassName() override {return "Player"};
};

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

int main()
{
	Entity* e = new Entity();
	//std::cout << e->GetName() << std::endl;
	//PrintName(e);

	Player* p = new Player("Cherno");
	//std::cout << p->GetName() << std::endl;
	//PrintName(p);
    PrintClassName(e);
    PrintClassName(p);
	std::cin.get();
}
#include<iostream>

class Printable
{
public:
    virtual std::string GetClassName() = 0;
};

class Entity : public Printable
{
public:
	//std::string GetName(){ return "Entity"; }
    std::string GetClassName() override {return "Entity";}
};
void PrintName(Entity* Entity)
{
	std::cout << Entity->GetName() << std::endl;
}
class Player : public Entity,Printable
{
private:
	std::string m_Name;
public:
	Player(const std::string& name)
		: m_Name(name){}

	//std::string GetName(){ return m_Name; }
    std::string GetClassName() override {return "Player";}
};

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

int main()
{
	Entity* e = new Entity();
	//std::cout << e->GetName() << std::endl;
	//PrintName(e);

	Player* p = new Player("Cherno");
	//std::cout << p->GetName() << std::endl;
	//PrintName(p);
    PrintClassName(e);
    PrintClassName(p);
	std::cin.get();
}

Printable类就相当于是一个接口

标签:std,string,GetName,C++,Entity,学习,纯虚,public
From: https://blog.csdn.net/m0_63694583/article/details/142464801

相关文章

  • 《深度学习》—— 神经网络中的调整学习率
    文章目录一、什么是调整学习率?二、使用PyTorch中的库函数进行调整学习率三种常用的方法1.StepLR2.MultiStepLR3.CosineAnnealingLR一、什么是调整学习率?调整学习率(AdjustingLearningRate)是在机器学习,特别是在深度学习中,对优化算法中的一个关键超参数进行动态......
  • C/C++语言基础--C++类数据、静态与非静态、常成员、友员、成员变量与函数指针等相关知
    本专栏目的更新C/C++的基础语法,包括C++的一些新特性前言通过前面几节,我们介绍了C++的类与对象、构造与析构函数、拷贝等相关知识,这一篇将详细介绍了C++的成员变量相关的知识点与扩展C语言后面也会继续更新知识点,如内联汇编;本人现在正在写一个C语言的图书管理系统,1000多......
  • 《深度学习》—— 神经网络中常用的激活函数
    文章目录1.Sigmoid激活函数2.Softmax激活函数3.ReLU激活函数4.LeakyReLU激活函数5.ELU激活函数6.Tanh激活函数激活函数(ActivationFunction)是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。它在神经网络中扮演着至关重要的角色,主......
  • 关于HarmonyOS的学习
    day35一、回调地狱  //比如我们发送三个ajax请求  //-第一个正常发送  //-第二个请求需要第一个请求的结果中的某一个值作为参数  //-第三个请求需要第二个请求的结果中的某一个值作为参数  ajax_get({    url:'http://localhost......
  • 关于HarmonyOS的学习
    day36一、可选链和空集合并符1.?  //?作用:1、三目运算符2、可选链  constobj={    id:1,    //info:{    //  name:'张',    //  age:18    //} }  console.log(obj.id)  cons......
  • Day1 c++(发展历史,特点,面向对象核心术语,开发环境,新建项目,引用,窄化,输入,字符串,函数)
    1.C++发展历史(了解)1983年,贝尔实验室(BellLabs)的BjarneStroustrup发明了C++。C++在C语言的基础上进行了扩充和完善,是一种面向对象程序设计(OOP)语言。Stroustrup说:“这个名字象征着源自于C语言变化的自然演进”。还处于发展完善阶段时被称为“newC”,之后被称为“Cwi......
  • 【C++】队列
    示意图什么是队列队列(queue)是一种具有先进入队列的元素一定先出队列性质的表。由于该性质,队列通常也被称为先进先出(firstinfirstout)表,简称FIFO表。就像排队一样,最先到的人也就最先买到单,优先离开队伍头文件与声明头文件#include<queue>声明定义queue<G>qu......
  • Java中集合泛型的学习
    集合遍历目录集合遍历泛型的基本概念泛型的好处泛型的使用1.泛型类2.泛型接口3.泛型方法Java集合框架中的泛型泛型通配符Java集合泛型是JavaSE1.5(Java5)中引入的一个重要特性,它允许在定义类、接口和方法时指定一个或多个类型参数。这些类型参数在实例化或调用时会被具体的......
  • 【C++】面向对象编程的三大特性:深入解析继承机制
    C++语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C++相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C++内存管理模板初阶String使用String模拟实现Vector使用及其模拟实现List使用及其模拟实现容器适配器Stack与QueuePriority......
  • prometheus学习笔记之集群内服务发现环境准备
    一、环境介绍主要演示prometheus在k8s集群中如何通过服务自动去发现k8s集群自有服务及其他服务发现场景,后续会演示集群外部署prometheus自动发现k8s服务并获取数据创建监控使用的namespaceskubectlcreatensmonitoring配置docker可以下载镜像[root@k8s-masterdeploy]#cat/etc/......