effective c++ 为多态基类声明virtual析构函数
2015-09-10 22:39
591 查看
C++的多态性
当derived class 对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果未有定义—–实际执行通常是derived成分没有被销毁
任何class只要带virtual函数都几乎确定应该也有一个virtual 析构函数
为你希望成为抽象的那个class声明一个pure virtual析构函数
class TextBlock { public: virtual void foo() { cout << "TextBlock" << endl; } }; class Text : public TextBlock { public: void foo() { cout << "Text" << endl; } }; int main() { TextBlock *a = new TextBlock; TextBlock *b = new Text; Text *c = new Text; a -> foo(); //TextBlock b -> foo(); //Text -> polymorphically c -> foo(); //Text }
当derived class 对象经由一个base class指针被删除,而该base class带着一个non-virtual析构函数,其结果未有定义—–实际执行通常是derived成分没有被销毁
任何class只要带virtual函数都几乎确定应该也有一个virtual 析构函数
class TextBlock { public: virtual void foo() { cout << "TextBlock" << endl; } virtual ~TextBlock(){} }; class Text : public TextBlock { public: void foo() { cout << "Text" << endl; } }; int main() { TextBlock *b = new Text; b -> foo(); delete b; }
class TextBlock : public string { //馊主意,string有个non-virtual析构函数 }; int main() { TextBlock * p1 = new TextBlock(); string * p2 = p1; delete p2; ///未定义! }
为你希望成为抽象的那个class声明一个pure virtual析构函数
class TextBlock { public: virtual ~TextBlock() = 0; }; class Text : public TextBlock { }; TextBlock::~TextBlock(){} //如果没有定义,会编译错误 //编译器会在Text的析构函数中创建一个~TextBlock()的调用动作 int main() { TextBlock * p = new Text; delete p; }
相关文章推荐
- C++Primer第五版 2.3.2节练习
- C++学习之重载运算符1
- c++ using 关键字
- c++中字符数组与字符串的转换
- c++11可变参数模板
- C++的学习心得
- 玩儿转C语言:字符和字符串
- C++Primer第五版 2.3.1节练习
- 对C++中关联容器一些基础知识的认识
- C++ list函数详解
- C++Primer第五版 2.2.4节练习
- C++Primer第五版 2.2.3节练习
- 虚函数和纯虚函数
- C++Primer第五版 2.2.2节练习
- C++Primer第五版 2.2.1节练习
- C++内存对齐
- 常量指针、指针常量、C++类型转换
- C++用法的学习心得
- [置顶] C++强大背后
- C++Primer第五版 2.1.3节练习