有时,由于我们不知道实现,因此无法在基类中提供所有功能的实现。这样的类称为抽象类。例如,让 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;
};
一个完整的例子:
纯虚函数由派生自抽象类的类实现。以下是一个简单的示例来演示相同的内容。
#includeusing 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) 我们可以有抽象类类型的指针和引用。
例如以下程序可以正常工作。
#includeusing 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) 如果我们不重写派生类中的纯虚函数,那么派生类也会变成抽象类。
以下示例演示了相同的内容。
#includeusing 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) 抽象类可以有构造函数。
例如,以下程序编译并运行良好。
#includeusing 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 中,我们只提供类的主体,我们在实现它的任何类中编写实际代码。
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。



