我有一个链接错误,其中连接器抱怨我的具体类的析构函数正在调用其抽象超类析构函数,其代码丢失。链接器错误:想C++虚拟基类析构函数
这是在XCode的Mac OS X上使用GCC 4.2。
我看到了g++ undefined reference to typeinfo但它不是完全相同的东西。
这里是接头错误消息:
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);
};
不用说,所有这些成员都得到执行。这里是析构函数:
AlwaysConnectedConnectionZPool::~AlwaysConnectedConnectionZPool()
{
printf("AlwaysConnectedConnectionZPool destructor call"); // nothing to destruct in fact
}
,也或许工厂例行:
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);
}
我可以人为地让我的抽象基类,具体解决此问题。但我宁愿做更好的事情。任何想法?
感谢
您的回答暗示,但值得强调的是,在C++中,抽象方法*可以具有实现。当我发现时,我真的很惊讶,在此之前,我一直认为方法不是抽象的就是有实现,而不是两者。 – sbk 2010-03-31 17:32:30
@sbk这是不正确的。在C++中抽象意味着_pure_虚拟。一个_non-pure_虚函数不是抽象的,也不是抽象的。 – Zimano 2016-01-07 11:40:16
@Zimano:我评论的哪部分内容不正确?我同意“纯虚拟”和“抽象”是一回事。我在说,在C++中,抽象/纯虚拟方法*可以具有body/implementation和destructor,即使是抽象的,也必须具有一个。即片段'''class A {virtual〜A()= 0 {}}'''是有效的 – sbk 2016-01-13 12:44:32