栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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;
    
   
};

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

#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() 调用
一些有趣的事实:

    如果一个类至少有一个纯虚函数,那么它就是抽象的。
    在下面的例子中,Test 是一个抽象类,因为它有一个纯虚函数 show()。
// 纯虚函数使类抽象
#include
使用命名空间标准;
类测试
{
int x;
公共:
虚拟无效显示()= 0;
int 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 calledn";
            }
};
  
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 中,我们只提供类的主体,我们在实现它的任何类中编写实际代码。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/721945.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号