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 指针或引用,否则将无法正常工作。