声明纯虚函数时出现 C++ LNK2001 错误
C++ LNK2001 Error When declaring Pure Virtual Function
我有两个classes,基础class A和派生class B。定义如下:
Class A {
public:
A()
{
ImpleDefinition();
}
~A()=default:
protected:
virtual void ImplDefinition()=0;
}
class B : public A
{
public:
B() : A()
{
}
~B()=default;
private:
void ImplDefinition() override
{
/*Some detailed implementation*/
}
}
所以在编译这段代码时,编译器报"error LNK2001: unresolved external symbol"错误。从代码本身来看,我看不出我犯了任何错误。有趣的是,如果我将 "ImplDefinition" 从纯虚函数更改为虚函数。
void ImplDefinition() {};
然后一切正常。这种情况怎么解释?
您正试图从同一个 class 的构造函数中调用纯虚函数。形式上,行为是未定义的。在实践中,此类代码出现链接器错误是完全正常的。
当从构造函数或析构函数调用虚函数时,虚机制在当前层级是 "capped":它工作 "up to" 而 class 是 constructed/destructed。它永远不会看到或调用来自任何 derived classes.
的任何覆盖虚函数
在你的情况下,A
的构造函数中的 ImpleDefinition()
调用没有看到也没有调用 B::ImpleDefinition
(与你显然想要的相反)。相反,它会尝试调用 A::ImpleDefinition
。由于未定义 A::ImpleDefinition
,因此调用失败。
您尝试做的事情不会奏效,至少在这种形式下是这样。您不能通过调用在派生 classes.
中覆盖的虚函数来 "virtualize" 构造函数的行为
问题是您在 A::A()
中调用虚函数 ImplDefinition()
。在baseclass的构造函数中,当前对象始终是baseclass子对象,derivedclass部分根本不构造;这将在稍后执行。那么纯虚的A::ImplDefinition()
就会被调用而报错;这里没有动态调度,B::ImplDefinition()
根本不会被调用。
我有两个classes,基础class A和派生class B。定义如下:
Class A {
public:
A()
{
ImpleDefinition();
}
~A()=default:
protected:
virtual void ImplDefinition()=0;
}
class B : public A
{
public:
B() : A()
{
}
~B()=default;
private:
void ImplDefinition() override
{
/*Some detailed implementation*/
}
}
所以在编译这段代码时,编译器报"error LNK2001: unresolved external symbol"错误。从代码本身来看,我看不出我犯了任何错误。有趣的是,如果我将 "ImplDefinition" 从纯虚函数更改为虚函数。
void ImplDefinition() {};
然后一切正常。这种情况怎么解释?
您正试图从同一个 class 的构造函数中调用纯虚函数。形式上,行为是未定义的。在实践中,此类代码出现链接器错误是完全正常的。
当从构造函数或析构函数调用虚函数时,虚机制在当前层级是 "capped":它工作 "up to" 而 class 是 constructed/destructed。它永远不会看到或调用来自任何 derived classes.
的任何覆盖虚函数在你的情况下,A
的构造函数中的 ImpleDefinition()
调用没有看到也没有调用 B::ImpleDefinition
(与你显然想要的相反)。相反,它会尝试调用 A::ImpleDefinition
。由于未定义 A::ImpleDefinition
,因此调用失败。
您尝试做的事情不会奏效,至少在这种形式下是这样。您不能通过调用在派生 classes.
中覆盖的虚函数来 "virtualize" 构造函数的行为问题是您在 A::A()
中调用虚函数 ImplDefinition()
。在baseclass的构造函数中,当前对象始终是baseclass子对象,derivedclass部分根本不构造;这将在稍后执行。那么纯虚的A::ImplDefinition()
就会被调用而报错;这里没有动态调度,B::ImplDefinition()
根本不会被调用。