C++学习
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类就相当于是一个接口
原文地址:https://blog.csdn.net/m0_63694583/article/details/142464801
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!