原标题:C ++中的纯虚函数和抽象类
有时无法在基类中提供所有函数的实现,因为我们不知道实现。这样的类称为抽象类。 例如,让Shape为基类。我们不能在Shape中提供函数draw()的实现,但是我们知道每个派生类都必须具有draw()的实现。类似地,Animal类没有move()的实现(假设所有动物都移动),但所有动物都必须知道如何移动。我们无法创建抽象类的对象。
C ++中的纯虚函数(或抽象函数)是我们没有实现的虚函数,我们只声明它。通过在声明中赋值0来声明纯虚函数。请参阅以下示例。
// An abstract class
class Test
{
// Data members of class
public:
// Pure Virtual Function
virtual void show() = 0;
/* Other members */
};
一个完整的示例:
纯虚函数由派生自Abstract类的类实现。以下是演示相同的简单示例。
#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()。
// pure virtual functions make a class abstract
#include
using namespace std;
class Test
{
int x;
public:
virtual void show() = 0;
int getX() { return x; }
};
int main(void)
{
Test t;
return 0;
}
输出:
编译器错误:无法将变量't'声明为抽象
输入'Test',因为以下虚函数是纯函数
在'Test'中:注意:virtual void Test :: show()
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; }
};
class Derived: public Base
{
int y;
public:
Derived(int i, int j):Base(i) { y = j; }
void fun() { cout << "x = " << x << ", y = " << y; }
};
int main(void)
{
Derived d(4, 5);
d.fun();
return 0;
}
输出:
x = 4,y = 5
与Java的比较
在Java中,可以使用abstract关键字使类成为抽象类。类似地,可以使用abstract关键字将函数设置为纯虚拟或抽象。有关更多详细信息,请参阅
Java中的抽象类。
接口与抽象类:
接口没有任何方法的实现,它可以被视为方法声明的集合。在C ++中,可以通过将所有方法都设置为纯虚拟来模拟接口。在Java中,接口有一个单独的关键字。返回搜狐,查看更多
责任编辑: