假设{C}程序中foo
是抽象 class
,为什么声明foo*
类型的变量是可接受的,而不是foo
类型的变量1}}?
答案 0 :(得分:14)
因为如果你声明一个foo,你必须初始化/实例化它。如果你声明一个* foo,你可以使用它来指向从foo继承但不是抽象的类的实例(因此可以实例化)
答案 1 :(得分:5)
您无法实例化抽象类。以下声明之间存在差异。
// 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();
答案 2 :(得分:1)
此外,因为抽象类通常用作父类(基类 - ABC),用于多态性
class Abstract {}
class DerivedNonAbstract: public Abstract {}
void CallMe(Abstract* ab) {}
CallMe(new DerivedNonAbstract("WOW!"));
答案 3 :(得分:0)
因为指向foo的指针不是foo - 它们是完全不同的类型。创建类抽象说你不能创建类类型的对象,而不是你不能创建类的指针(或引用)。
答案 4 :(得分:0)
因为如果我们声明foo,我们正在创建一个抽象类foo的实例,并且不可能创建抽象类的实例。但是,我们可以使用抽象类的指针指向其驱动类以利用多态性。 。