抽象类技术咨询:无纯虚函数能否定义抽象类?是否可含数据成员?实例判定
关于C++抽象类的三个问题解答
1. 是否可以在不将成员函数声明为纯虚函数的情况下定义抽象类?
在C++的标准定义里,抽象类的核心要求就是至少包含一个纯虚函数。如果你的类里没有任何纯虚函数,哪怕你通过把构造函数设为protected来阻止外部直接实例化这个类,它也不算严格意义上的抽象类。
为什么这么说?因为这种类只是被限制了实例化,但编译器不会把它当作抽象类来进行强制检查——比如子类不需要强制实现某个特定函数,而且子类完全可以正常实例化。只有当类中存在纯虚函数时,编译器才会标记它为抽象类,同时阻止任何直接实例化的尝试,并且强制子类必须实现所有未被覆盖的纯虚函数,否则子类也会变成抽象类。
所以结论是:不行,必须通过声明至少一个纯虚函数来定义抽象类。
2. 抽象类是否允许包含数据成员?
当然可以!抽象类的本质是作为基类,为子类提供统一的接口规范,同时它完全可以拥有自己的数据成员,用来存储子类通用的属性。
比如你给出的代码里,electronic类就有int a和char b两个数据成员,这完全合法。这些数据成员会被子类继承,子类可以通过成员函数(包括纯虚函数的实现)来访问和使用它们。抽象类只是不能被直接实例化,但它的成员(数据和函数)的规则和普通类是一致的。
3. 给出的代码定义的类是否属于抽象类?
是的,这个electronic类是标准的抽象类。
原因很简单:它包含了一个纯虚函数virtual void specifications() = 0;——只要类中有至少一个纯虚函数,不管它有没有数据成员,编译器都会把它标记为抽象类,禁止直接实例化,同时要求子类必须实现这个纯虚函数才能被实例化。
内容的提问来源于stack exchange,提问作者Farhad Bhatti
相关产品推荐
相关产品推荐

