C++ 派生 class 和虚拟析构函数
C++ derived class and virtual destructor
请看下面的简单代码:
#include <iostream>
using namespace std;
class semi_shape_1 {
public:
void output() { cout <<" semi_shape_1 works fine.\n"; }
virtual ~semi_shape_1();
protected:
semi_shape_1(){ output();}
};
class test_semiShape_1 : public semi_shape_1 {
};
int main()
{
test_semiShape_1 ts1;
return 0;
}
semi_shape_1
是低音 class 并且 test_semiShape_1
是从它派生出来的。
当我 运行 代码时,我得到如下两个错误:
Error1 error LNK2019: 未解析的外部符号 "public: virtual __thiscall semi_shape_1::~semi_shape_1(void)" (??1semi_shape_1@@UAE@XZ) 在函数 "public: virtual __thiscall test_semiShape_1::~test_semiShape_1(void)" (??1test_semiShape_1@@UAE@XZ) C:\Users\ME\Documents\Visual Studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\ConsoleApplication1.obj
Error2 error LNK1120: 1 个未解决的外部 C:\Users\ME\Documents\Visual Studio 2012\Projects\ConsoleApplication1\Debug\ConsoleApplication1.exe 1
请问我的代码有什么问题?
机器:Windows7.
IDE: visual studio 2012.
您已经声明了一个析构函数但没有实现它。
您必须提供析构函数的定义。
virtual ~semi_shape_1() {}
或在 C++11 中
virtual ~semi_shape_1() = default;
或者如果 semi_shape_1
应该是一个抽象的 class,你可以让它变得纯粹,但不要忘记在 class 定义之外定义它:
virtual ~semi_shape_1() = 0;
// ...
semi_shape_1::~semi_shape_1() = default;
没有实现基础 class 的析构函数。如果您不提供定义,编译器将隐式创建一个,但既然您提供了定义,那么您还必须提供实现。 Tony的评论有答案:
Just change virtual ~semi_shape_1(); to virtual ~semi_shape_1() { }
请看下面的简单代码:
#include <iostream>
using namespace std;
class semi_shape_1 {
public:
void output() { cout <<" semi_shape_1 works fine.\n"; }
virtual ~semi_shape_1();
protected:
semi_shape_1(){ output();}
};
class test_semiShape_1 : public semi_shape_1 {
};
int main()
{
test_semiShape_1 ts1;
return 0;
}
semi_shape_1
是低音 class 并且 test_semiShape_1
是从它派生出来的。
当我 运行 代码时,我得到如下两个错误:
Error1 error LNK2019: 未解析的外部符号 "public: virtual __thiscall semi_shape_1::~semi_shape_1(void)" (??1semi_shape_1@@UAE@XZ) 在函数 "public: virtual __thiscall test_semiShape_1::~test_semiShape_1(void)" (??1test_semiShape_1@@UAE@XZ) C:\Users\ME\Documents\Visual Studio 2012\Projects\ConsoleApplication1\ConsoleApplication1\ConsoleApplication1.obj
Error2 error LNK1120: 1 个未解决的外部 C:\Users\ME\Documents\Visual Studio 2012\Projects\ConsoleApplication1\Debug\ConsoleApplication1.exe 1
请问我的代码有什么问题?
机器:Windows7.
IDE: visual studio 2012.
您已经声明了一个析构函数但没有实现它。
您必须提供析构函数的定义。
virtual ~semi_shape_1() {}
或在 C++11 中
virtual ~semi_shape_1() = default;
或者如果 semi_shape_1
应该是一个抽象的 class,你可以让它变得纯粹,但不要忘记在 class 定义之外定义它:
virtual ~semi_shape_1() = 0;
// ...
semi_shape_1::~semi_shape_1() = default;
没有实现基础 class 的析构函数。如果您不提供定义,编译器将隐式创建一个,但既然您提供了定义,那么您还必须提供实现。 Tony的评论有答案:
Just change virtual ~semi_shape_1(); to virtual ~semi_shape_1() { }