自学内容网 自学内容网

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)!