C++ 中的纯虚函数和抽象类

有时,由于我们不知道实现,因此无法在基类中提供所有功能的实现。这样的类称为抽象类。例如,让 Shape 成为一个基类。我们无法在 Shape 中提供函数 draw() 的实现,但我们知道每个派生类都必须有 draw() 的实现。同样,Animal 类没有 move() 的实现(假设所有动物都移动),但所有动物都必须知道如何移动。我们不能创建抽象类的对象。
C++中的纯虚函数(或抽象函数)是虚函数我们可以实现,但是我们必须在派生类中重写该函数,否则派生类也将成为抽象类(有关我们在哪里为此类函数提供实现的更多信息,请参阅此https://stackoverflow.com/问题/2089083/pure-virtual-function-with-implementation)。通过在声明中分配 0 来声明纯虚函数。请参阅以下示例。

// An abstract class
class Test
{   
    // Data members of class
public:
    // Pure Virtual Function
    virtual void show() = 0;
    
   /* Other members */
};

一个完整的例子:
纯虚函数由派生自抽象类的类实现。以下是一个简单的示例来演示相同的内容。

#include
using namespace std;
  
class Base
{
   int x;
public:
    virtual void fun() = 0;
    int getX() { return x; }
};
  
// This class inherits from Base and implements fun()
class Derived: public Base
{
    int y;
public:
    void fun() { cout << "fun() called"; }
};
  
int main(void)
{
    Derived d;
    d.fun();
    return 0;
}

输出:

fun() 调用
一些有趣的事实:

  1. 如果一个类至少有一个纯虚函数,那么它就是抽象的。
    在下面的例子中,Test 是一个抽象类,因为它有一个纯虚函数 show()。
// 纯虚函数使类抽象
#include
使用命名空间标准;
类测试
{
int x;
公共:
虚拟无效显示()= 0int getX() { 返回 x; }
};

int main(void)
{
测试 t;
返回0}

输出:

编译器错误:不能将变量“t”声明为抽象的
键入“Test”,因为以下虚函数是纯的
在“测试”中:注意:虚拟无效测试::显示()
2) 我们可以有抽象类类型的指针和引用。
例如以下程序可以正常工作。

#include
using namespace std;
  
class Base
{
public:
    virtual void show() = 0;
};
  
class Derived: public Base
{
public:
    void show() { cout << "In Derived \n"; }
};
  
int main(void)
{
    Base *bp = new Derived();
    bp->show();
    return 0;
}

输出:

在派生
3) 如果我们不重写派生类中的纯虚函数,那么派生类也会变成抽象类。
以下示例演示了相同的内容。

#include
using namespace std;
class Base
{
public:
    virtual void show() = 0;
};
  
class Derived : public Base { };
  
int main(void)
{
  Derived d;
  return 0;
}

编译器错误:无法将变量“d”声明为抽象类型
‘Derived’ 因为以下虚函数是纯的
“派生”:虚拟 void Base::show()
4) 抽象类可以有构造函数。
例如,以下程序编译并运行良好。

#include
using namespace std;
  
// An abstract class with constructor
class Base
{
protected:
int x;
public:
virtual void fun() = 0;
Base(int i) {
              x = i; 
            cout<<"Constructor of base called\n";
            }
};
  
class Derived: public Base
{
    int y;
public:
    Derived(int i, int j):Base(i) { y = j; }
    void fun() { cout << "x = " << x << ", y = " << y<<'\n'; }
};
  
int main(void)
{ 
    Derived d(4, 5); 
    d.fun();
    
  //object creation using pointer of base class
    Base *ptr=new Derived(6,7);
      ptr->fun();
    return 0;
}

输出:

基类的构造函数称为
x = 4,y = 5
基类的构造函数称为
x = 6,y = 7
与 Java 的比较
在 Java 中,可以使用 abstract 关键字将类抽象化。类似地,可以使用 abstract 关键字使函数成为纯虚函数或抽象函数。有关详细信息,请参阅
Java 中的抽象类。
接口与抽象类:
接口没有任何方法的实现,它可以被视为方法声明的集合。在 C++ 中,可以通过将所有方法设为纯虚拟来模拟接口。在 Java 中,接口有一个单独的关键字。

我们可以将接口视为 C++ 中的头文件,就像在头文件中我们只提供将要实现它的类的主体。同样,在 java in Interface 中,我们只提供类的主体,我们在实现它的任何类中编写实际代码。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

你可能感兴趣的:(C++程序教学,c++,开发语言,后端)