C++ 错误c2259“类”:无法实例化抽象类

C++ 错误c2259“类”:无法实例化抽象类,c++,class,vector,constructor,abstract,C++,Class,Vector,Constructor,Abstract,我对抽象类有这个问题,我在互联网上到处都查到了,包括这里,我问了朋友们,我仍然没有得到答案 我有一个名为“RulePrvoider”的类,还有三个从“Rule Provider”继承的类“GlobalRuleProvider”、“UserRuleProvider”和“OrgRuleProvider”。我还有一个叫做“PacketFilter”的类,这就是我遇到问题的类 我发现如果我把“push_back”放在注释中,程序会编译,但我似乎不知道为什么 这是PacketFilter。h: #ifnd

我对抽象类有这个问题,我在互联网上到处都查到了,包括这里,我问了朋友们,我仍然没有得到答案

我有一个名为“RulePrvoider”的类,还有三个从“Rule Provider”继承的类“GlobalRuleProvider”、“UserRuleProvider”和“OrgRuleProvider”。我还有一个叫做“PacketFilter”的类,这就是我遇到问题的类

我发现如果我把“push_back”放在注释中,程序会编译,但我似乎不知道为什么

这是PacketFilter。h:

#ifndef _PACKETFILTER_H
#define _PACKETFILTER_H

#include <vector>
#include <set>

#include "OrgRuleProvider.h"
#include "GlobalRuleProvider.h"
#include "UserRuleProvider.h"
class PacketFilter
{
private:
    std::vector <RuleProvider>providers;
    string globalProvider;
    std::set <Rule>rules;
    void update();
public:
    PacketFilter(string globalProviderPath, string* orgProviderPath, string* userProviderPath);
    bool filter(string srcIP, string srcPort, string dstIP, string dstPort, string protocol);
};
#endif
这是packetFilter构造函数,这就是我遇到的问题:

#include "PacketFilter.h"

PacketFilter::PacketFilter(string globalProviderPath, string* orgProviderPath, string* userProviderPath)
{
    int i;
    RuleProvider* rProv;
    try{
        rProv = new GlobalRuleProvider(globalProviderPath);
    }
    catch (int e){
        std::cout << "exception number " << e << std::endl;
    }
    providers.push_back(*rProv);
    for (i = 0; i <orgProviderPath->size(); i++)
    {
        rProv = new OrgRuleProvider(orgProviderPath[i]);
        providers.push_back(*rProv);
    }
    for (i = 0; i < userProviderPath->size(); i++)
    {
        rProv = new UserRuleProvider(userProviderPath[i]);
        providers.push_back(*rProv);
    }
}
如果有人发现这个问题,我会非常高兴和感激

提前谢谢

你做不到

std::vector <RuleProvider> providers;
指针与抽象类型不同,因为实际对象本身是RuleProvider的子类,而不是抽象基类

当你把_推回到向量上时,推你用new做的指针;不要用*取消引用它们

当您使用完向量后,您需要记住删除所有指针。

这是因为提供者是一个std::vector。当您推回RuleProvider的一个具体子类的对象时,首先使用一个复制构造函数创建一个新的RuleProvider。但如果RuleProvider是抽象类,则会导致错误。规则是永远不要将子类与std容器一起使用。如果需要,您可以使用std::vector。

您正在使用new进行分配,然后将副本推回,从而导致内存泄漏。如果您想要虚拟行为,您应该保留指针而不是对象。
std::vector <RuleProvider*> providers;