c++中的抽象类声明

abstract class declarations in c++

本文关键字:声明 抽象类 c++      更新时间:2023-10-16

假设c++程序中的foo抽象 class,为什么可以声明foo*类型的变量,而不能声明foo类型的变量?

因为如果你声明一个foo你必须初始化/实例化它。如果你声明一个*foo,你可以用它来指向从foo继承的类的实例,但不是抽象的(因此可以被实例化)

不能实例化抽象类。以下声明之间存在差异。

// declares only a pointer, but do not instantiate.
// So this is valid
AbstractClass *foo;
// This actually instantiate the object, so not valid
AbstractClass foo;
// This is also not valid as you are trying to new
AbstractClass *foo = new AbstractClass();
// This is valid as derived concrete class is instantiated
AbstractClass *foo = new DerivedConcreteClass();

另外,由于抽象类通常用作父类(基类- ABC),您将其用于多态性

class Abstract {}
class DerivedNonAbstract: public Abstract {}

void CallMe(Abstract* ab) {}

CallMe(new DerivedNonAbstract("WOW!"));

因为指向foo的指针不是foo——它们是完全不同的类型。使类抽象意味着不能创建类类型的对象,而不是不能创建指向该类的指针(或引用)。

因为如果我们声明foo,这意味着我们正在创建一个抽象类foo的实例,而创建一个抽象类的实例是不可能的。但是,我们可以使用抽象类的指针指向它的驱动类,以利用多态性的优势……