C++ 链接器错误:需要C++;虚拟基类析构函数
我有一个链接错误,链接器抱怨我的具体类的析构函数正在调用它的抽象超类析构函数,代码缺失 这是从XCode在MacOSX上使用GCC4.2 我看到了,但不完全一样 以下是链接器错误消息:C++ 链接器错误:需要C++;虚拟基类析构函数,c++,gcc,abstract-class,linker-errors,C++,Gcc,Abstract Class,Linker Errors,我有一个链接错误,链接器抱怨我的具体类的析构函数正在调用它的抽象超类析构函数,代码缺失 这是从XCode在MacOSX上使用GCC4.2 我看到了,但不完全一样 以下是链接器错误消息: Undefined symbols: "ConnectionPool::~ConnectionPool()", referenced from: AlwaysConnectedConnectionZPool::~AlwaysConnectedConnectionZPool()in RKConnec
Undefined symbols:
"ConnectionPool::~ConnectionPool()", referenced from:
AlwaysConnectedConnectionZPool::~AlwaysConnectedConnectionZPool()in RKConnector.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
以下是抽象基类声明:
class ConnectionPool {
public:
static ConnectionPool* newPool(std::string h, short p, std::string u, std::string pw, std::string b);
virtual ~ConnectionPool() =0;
virtual int keepAlive() =0;
virtual int disconnect() =0;
virtual sql::Connection * getConnection(char *compression_scheme = NULL) =0;
virtual void releaseConnection(sql::Connection * theConnection) =0;
};
class AlwaysConnectedConnectionZPool: public ConnectionPool {
protected:
<snip data members>
public:
AlwaysConnectedConnectionZPool(std::string h, short p, std::string u, std::string pw, std::string b);
virtual ~AlwaysConnectedConnectionZPool();
virtual int keepAlive(); // will make sure the connection doesn't time out. Call regularly
virtual int disconnect(); // disconnects/destroys all connections.
virtual sql::Connection * getConnection(char *compression_scheme = NULL);
virtual void releaseConnection(sql::Connection * theConnection);
};
下面是具体的类声明:
class ConnectionPool {
public:
static ConnectionPool* newPool(std::string h, short p, std::string u, std::string pw, std::string b);
virtual ~ConnectionPool() =0;
virtual int keepAlive() =0;
virtual int disconnect() =0;
virtual sql::Connection * getConnection(char *compression_scheme = NULL) =0;
virtual void releaseConnection(sql::Connection * theConnection) =0;
};
class AlwaysConnectedConnectionZPool: public ConnectionPool {
protected:
<snip data members>
public:
AlwaysConnectedConnectionZPool(std::string h, short p, std::string u, std::string pw, std::string b);
virtual ~AlwaysConnectedConnectionZPool();
virtual int keepAlive(); // will make sure the connection doesn't time out. Call regularly
virtual int disconnect(); // disconnects/destroys all connections.
virtual sql::Connection * getConnection(char *compression_scheme = NULL);
virtual void releaseConnection(sql::Connection * theConnection);
};
也可能是工厂常规:
ConnectionPool* ConnectionPool::newPool(std::string h, short p, std::string u, std::string pw, std::string b)
{
return new AlwaysConnectedConnectionZPool(h, p, u, pw, b);
}
我可以通过人为地使抽象基类具体化来解决这个问题。但我宁愿做得更好。有什么想法吗
谢谢即使将析构函数声明为纯虚拟函数,也必须为其提供实现。虽然不能直接实例化抽象类,但在实例化其派生(具体)类时,它总是被实例化。因此,在某个时刻,这些实例将被销毁,因此需要一个析构函数。纯虚拟析构函数的实现可以(通常是)为空函数:
ConnectionPool::~ConnectionPool() {
}
即使在抽象类中,也不希望析构函数是纯虚拟的。这是因为当一个具体的子类的析构函数被调用时,它将被调用 我们使用以下模式 福安 foo.cpp
AbstractBaseClass::~AbstractBaseClass() {
}
参见.< /p>您的回答意味着,但是值得强调的是C++中的抽象方法可以实现。当我发现之前,我一直认为方法要么是抽象的,要么是有实现的,而不是两者都有。@sbk这是错误的。在C++中,抽象意味着纯虚拟。非纯虚函数不是抽象的,也不会使其类抽象。@Zimano:我的评论哪部分是不正确的?我同意“纯虚拟”和“抽象”是一回事。我是说C++中的抽象/纯虚方法可以有体/实现和析构函数,甚至抽象,必须有一个。也就是说,代码段
类A{virtual~A()=0{}
是valid@sbk当我尝试纯虚方法的定义必须出格时,我得到了“函数定义上的纯说明符”,即类a{virtual~a()=0;};答::~A(){}
如果希望它是纯虚拟的,只需要提供一个实现。另外,您发布的链接没有针对纯虚拟析构函数。@MPG:有时您可能想声明一个抽象基类(无法实例化的基类),但您发现自己没有虚拟函数-您可以始终声明析构函数为纯虚拟的-然后正如Neil所说,它必须有一个实现(我也不确定我是否意识到了)。@Neil:如果抽象基类有其他纯虚拟方法,那么dtor也没有什么特别的理由是纯的(据我所知)。正如您所提到的,它需要有一个实现。考虑到这两个前提,没有理由让dtor成为一个纯虚拟方法-我想质疑一个类的基本原理,其中唯一的纯虚拟方法是dtor。@Michael同意。尽管有些人可能会说,如果您的类是抽象的,它应该总是有一个PVD-th如果您可以添加或删除其他PVF,而不会使类成为非抽象类。但是ConnectionPool::~ConnectionPool是在CPP文件中定义的吗?即使您将其声明为纯虚拟的,您也需要一个定义。析构函数很奇怪。该定义应该为空,并且我认为您不希望将其内联到H文件中。