继承和纯虚函数

纯虚函数指父类中的这个虚函数是完全空白的。普通的虚函数我们需要在子类中对其进行复写。默写情况下我们需要子类中的子函数完全提供属于他自己的定义而与父类中的虚函数没什么联系。当父类中采用纯虚函数时,不能够直接使用他,必须使用子类中的继承

#include<iostream>
#include<string>

class Entity
{
public:
    virtual std::string GetName() = 0;//uses "=0" to define pure virtual function
};

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* e)
{
    std::cout << e->GetName() << std::endl;
}

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

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

    std::cin.get();
}

如果在主函数中这样写会报错,因为无法直接引用纯虚函数,必须也只能调用它的子类

Entity *e=new Entity();

如果将类中继承的子函数注释掉,上述代码也无法正常运行。

假设我们现在想要一个函数,打印出类的名字,不管是父类还是子类都可以打印出来

#include<iostream>
#include<string>

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

class A :public Printable
{
public:
    std::string GetClassName() { return "A"; }
};

class Entity : public Printable
{
public:
    virtual std::string GetName() { return "Entity"; }
    std::string GetClassName() override{ 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; }
    std::string GetClassName() override { return "Player"; }
};

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

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

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

    Player *p = new Player("a");
    //PrintName(p);

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

注意:如果一个类中只有继承函数和纯虚函数,那么它将无法被实例化,无法被new

原文地址:https://www.cnblogs.com/wangtianning1223/p/12686210.html