定义:
c++中纯虚函数与java,c#等中的接口或抽象方法相同,实际上纯虚函数在我们基类定义一个没有实例化的函数,强制使子类实例化
#include<iostream>
#include<cstring>
using namespace std;
class Entity {
public:
virtual string GetName() { return "Entity"; }
};
class Player :public Entity {
private:
string m_Name;
public:
Player(const string& name):m_Name(name){}
string GetName() override { return m_Name; }//c++11之后新加的一种,用于检查virtual语法上是否有错
};
void PrintName(Entity* c) {
cout << c->GetName() << endl;
}
int main() {
Entity* e = new Entity();
PrintName(e);
Player* p = new Player("Cherno");
PrintName(p);
}
我们在调用PrintName(p)函数时,我们通过虚函数的重写不论如何都只是输出“Cherno”,那么父类Entity的实例化对于我们来说就没有用,则我们可以设为纯虚函数
virtual string GetName() = 0;
则
报错,因为没有实例化,我们可以修改为:
int main() {
Entity* e = new Player("Entity");
PrintName(e);
Player* p = new Player("Cherno");
PrintName(p);
}
目前我理解的是,指针类型在指向时并无意义,只是在解地址的时候会根据指针类型变化才有用
定义纯虚函数:
#include<iostream>
#include<cstring>
using namespace std;
class Printable
{
public:
virtual string GetclassName() = 0;
};
class Entity : public Printable
{
public:
virtual string GetName() { return "Entity"; }
string GetclassName() override { return "Entity"; }
};
class Player :public Entity
{
private:
string m_Name;
public:
Player(const string& name):m_Name(name){}
string GetName() override { return m_Name; }//c++11之后新加的一种,用于检查virtual语法上是否有错
string GetclassName() override { return m_Name; }
};
void PrintName(Entity* c)
{
cout << c->GetName() << endl;
}
void Print(Printable* obj)
{
cout << obj->GetclassName() << endl;
}
int main() {
//Entity* e = new Player("Entity");
Entity* e = new Entity();
//PrintName(e);
Player* p = new Player("Cherno");
//PrintName(p);
Print(e);
Print(p);
}
在C++中,接口只是C++中的一个类,仅此而已