抽象类|C++

抽象函数

抽象函数也可以在基类中实现。

class Role {
 public:
  virtual void attack() {
   cout << "角色!"<<endl;
  }
};

class Warrior: public Role {
 public:
  void attack() {
   cout << "战士!"<<endl;
  }
};

class Magician: public Role {
 public:
  void attack() {
   cout << "法师!"<<endl;
  }
};

现在,当你创建一个Role指针,并调用attack()函数时,编译器会调用该指针指向的对应于该对象类型的函数:

int main() {
 Warrior w;
 Magician m;
 Role r;

 Role *r1 = &w;
 Role *r2 = &m;
 Role *r3 = &r;

 r1->attack();
 // 输出 "战士!"

 r2->attack();
 // 输出 "法师!"

 r3->attack();
 // 输出 "角色!"
}
抽象类|C++插图

纯虚函数

在某些情况下,你希望在一个基类中包含一个抽象函数,以便它可以在派生类中被重新定义以适应该类的对象,但是没有有意义的定义给基类中的函数类。

没有定义的抽象成员函数被称为纯虚函数。他们指定派生类自己定义该函数。

语法是用= 0(一个等号和一个零)替换它们的定义:

class Role {
 public:
  virtual void attack() = 0;
}; 

一个纯虚函数基本上定义了派生类将自己去定义的那个函数。

从具有纯虚拟函数的类继承的每个派生类必须重写该函数

 如果纯虚函数没有在派生类中重写,那么当您尝试实例化派生类的对象时,代码将无法编译并导致错误。

抽象类|C++插图1

Role类中的纯虚函数必须在其派生类中重写。

class Role {
 public:
  virtual void attack() = 0;
};

class Warrior: public Role {
 public:
  void attack() {
   cout << "战士!"<<endl;
  }
};

class Magician: public Role {
 public:
  void attack() {
   cout << "法师!"<<endl;
  }
};

在Person类中声明一个纯虚函数sayHello(),并在派生类Boy类中重写它

#include <iostream>
using namespace std;
class Person{
public:
    virtual void sayHello() =0;
};
class Boy:public Person{
public:
    void sayHello(){
        cout << "Hello,My Dear." <<endl;
    }
};

我们不能对一个有纯虚函数的基类创建对象。

下列例子将会报错。

Role r; // Role拥有一个纯虚函数,这样创建对象将会报错

这些类被称为抽象类。他们只能被当作基类使用,因此被允许具有纯虚函数

我们可能会认为抽象基类是无用的,但事实并非如此。 它可以用来创建指针并利用其的多态性质

例如:

Warrior w;
Magician m;
Role *r1 = &w;
Role *r2 = &m;

r1->attack();
r2->attack();
抽象类|C++插图2

版权声明:
作者:RHZ
链接:https://www.rhzhz.cn/?p=976
来源:RHZ | 用文字记录工作和学习生活
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
海报
抽象类|C++
抽象函数 抽象函数也可以在基类中实现。 class Role { public: virtual void attack() { cout << "角色!"<<endl; } }; class War……
<<上一篇
下一篇>>