C++ Programmer's Cookbook

{C++ 基础} {C++ 高级} {C#界面,C++核心算法} {设计模式} {C#基础}

虚析构函数 ,纯虚析构函数必须实现的原因

就是因为动态调用是从下向上调用每一个,所以必须的实现.

原文删除,看下面周星星的评论吧,很不错的啊!很感谢周星星!

posted on 2006-07-31 20:42 梦在天涯 阅读(2728) 评论(6)  编辑 收藏 引用 所属分类: CPlusPlus

评论

# re: c++ error : LNK2019和LNK2001 2006-08-01 10:40 周星星

代码认为弄复杂了吧,其实写成如下就可以了
struct A
{
virtual ~A() = 0;
};
struct B : A
{
virual ~B() {}
};
int main( void )
{
B x;
}
编译的时候肯定报A::~A未实现,这是因为普通virtual只调用动态类型的那个函数实现,所以基类的可以不实现;而virtual析构函数则不同,它需要由下往上层层调用,所以每一层都需要实现。
另外,有没有实现代码 跟 是否为纯虚 是没有关系的,只要把 A 改为:
struct A
{
virtual ~A() = 0 {}
};
  回复  更多评论   

# ISO14882 12.4.7: 2006-08-01 11:12 周星星

A destructor can be declared virtual(10.3) or pure virtual(10.4);if any object of that class or any derived class are created in the program, the destructor shall be defined. If a class has a base class with a virtual destructor, its destructor (whether user-or implicitly-declared) is virtual.  回复  更多评论   

# re: c++ error : LNK2019和LNK2001 2006-08-01 11:24 周星星

hpho说
struct A
{
virtual ~A() = 0 {}
};
应当写成
struct A
{
virtual ~A() = 0;
};
A::~A()
{
}
因为C++规定 =0 和 {} 不能同时出现。
  回复  更多评论   

# re: c++ error : LNK2019和LNK2001 2006-08-01 11:49 周星星

ISO/IEC 14882:2003(E) 10.4.2:
[Note: a function declaration cannot provide both a pure-specifier and a definition
—end note]
[Example:
struct C {
virtual void f() = 0 { }; // ill-formed
};
—end example]  回复  更多评论   

# re: c++ error : LNK2019和LNK2001 2006-08-03 08:50 漂舟

看标准C++确实有好处,
偶最近也得到了 C++ 03标准文档, 哈哈,
向两位高手学习,
在C++博客,你们的文章看得最多,
表示感谢 !  回复  更多评论   

# re: 虚析构函数 ,纯虚析构函数必须实现的原因 2008-11-21 13:05 木易易

干嘛不用class来定义捏  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

EMail:itech001#126.com

导航

统计

  • 随笔 - 461
  • 文章 - 4
  • 评论 - 746
  • 引用 - 0

常用链接

随笔分类

随笔档案

收藏夹

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

积分与排名

  • 积分 - 1785193
  • 排名 - 5

最新评论

阅读排行榜