cpp 17 ,无法实例化抽象 class ,方式接口必须是指针?
cpp 17 , cannot instantiate abstract class , way Interface must be pointer?
我尝试在 C++ 中创建一个接口,使我能够使用它,因为我想要不同的类型来实现它。
得到:
cannot instantiate abstract class
例如:
BB.h
class BB {
public:
BB() {}
};
ICC.h
class BB;
class ICC {
public:
virtual BB launch(std::map<std::string, std::string>& ops) = 0;
};
C1.h
class C1: public ICC {
public:
C1() {}
BB launch(std::map<std::string, std::string>& ops){};
};
AA.h
class C1;
class AA {
public:
AA() {}
private:
ICC getC1() {
C1 c
return c;
}
ICC cc;
};
如果我像这样将 ICC 转换为指针:ICC *cc
一切正常
但是为什么我需要在这里使用指针?
问题出在AA.h。您无法实例化 cc.Also getC1() 可能未按预期实现,它会导致切片问题。
您只能创建实例化 ICC 的指针,因为它是纯虚拟的。
如果您进一步使用 Base-pointer 对象,您还可以考虑将析构函数设为虚拟。 (删除基指针对象将不会调用派生 类 的 dtor,如果未声明为虚拟的话。)
另一个提示是,如果您派生另一种方法,请使用 override/final。
如果 class 中至少有一个纯虚函数,则它被视为抽象 class。这些 classes 无法实例化。只允许使用指针(或引用)。
并且在这个函数中,
virtual BB launch(std::map<std::string, std::string>& ops) = 0;
您 returning 一个抽象的对象实例 class。正如我之前所说,这是不允许的。您必须 return 指针或引用,否则将无法正常工作。
我尝试在 C++ 中创建一个接口,使我能够使用它,因为我想要不同的类型来实现它。 得到:
cannot instantiate abstract class
例如:
BB.h
class BB {
public:
BB() {}
};
ICC.h
class BB;
class ICC {
public:
virtual BB launch(std::map<std::string, std::string>& ops) = 0;
};
C1.h
class C1: public ICC {
public:
C1() {}
BB launch(std::map<std::string, std::string>& ops){};
};
AA.h
class C1;
class AA {
public:
AA() {}
private:
ICC getC1() {
C1 c
return c;
}
ICC cc;
};
如果我像这样将 ICC 转换为指针:ICC *cc 一切正常 但是为什么我需要在这里使用指针?
问题出在AA.h。您无法实例化 cc.Also getC1() 可能未按预期实现,它会导致切片问题。 您只能创建实例化 ICC 的指针,因为它是纯虚拟的。
如果您进一步使用 Base-pointer 对象,您还可以考虑将析构函数设为虚拟。 (删除基指针对象将不会调用派生 类 的 dtor,如果未声明为虚拟的话。) 另一个提示是,如果您派生另一种方法,请使用 override/final。
如果 class 中至少有一个纯虚函数,则它被视为抽象 class。这些 classes 无法实例化。只允许使用指针(或引用)。
并且在这个函数中,
virtual BB launch(std::map<std::string, std::string>& ops) = 0;
您 returning 一个抽象的对象实例 class。正如我之前所说,这是不允许的。您必须 return 指针或引用,否则将无法正常工作。