1、如果一个类被继承,同时定义了基类以外的成员对象,且基类析构函数不是virtual修饰的,
那么当基类指针或引用指向派生类对象并析构(例如自动对象在函数作用域结束时;或者通过delete)时,会调用基类的析构函数而导致派生类定义的成员没有被析构,产生内存泄露等问题。虽然把析构函数定义成virtual的可以解决这个问题,但是当其它成员函数都不是virtual函数时,会在基类和派生类引入vtable,实例引入vptr造成运行时的性能损失。

如果确定不需要直接而是只通过派生类对象使用基类,可以把析构函数定义为protected(这样会导致基类和派生类外使用自动对象和delete时的错误,因为访问权限禁止调用析构函数),就不会导致以上问题。

测试代码1.1

#ifndef PROTECTED_TEST_H
#define PROTECTED_TEST_H
#include <iostream> class Base
{
public:
Base(){ data_ = new int(); }
~Base(){ std::cout << "Base class deconstructed." << std::endl; }
private:
int* data_;
}; class Child : public Base
{
public:
Child(){ m_data_ = new double(3.14159); }
~Child(){ std::cout << "Child class deconstructed." << std::endl; }
private:
double* m_data_;
}; #endif // PROTECTED_TEST_H int main(int argc, char *argv[])
{
    Base* base = new Child();
    delete base;
}

2、保证对象只生成在堆上。
从语法上来讲,一个函数被声明为protected或者private,那么这个函数就不能从“外部”直接被调用了。
对于protected的函数,子类的“内部”的其他函数可以调用之。
而对于private的函数,只能被本类“内部”的其他函数说调用。

通常使用的场景如下:
A)如果你不想让外面的用户直接构造一个类(假设这个类的名字为A)的对象,而希望用户只能构造这个类A的子类,那你就可以将类A的构造函数/析构函数声明为protected,而将类A的子类的构造函数/析构函数声明为public。例如:
class A
{ protected: A(){}
  public: ....
};
calss B : public A
{ public: B(){}
  ....
};
A a; // error
B b; // ok

B) 单例模式

http://blog.csdn.net/huzzyy/article/details/2562804

最新文章

  1. 使用Word2013发布博客
  2. Android 知识杂记(MVP模式)
  3. Extjs4.2或以上 使用自定义事件时报错问题
  4. fuck me on github
  5. 退出Activity(转)
  6. Qt实现FlatUI样式(开源)
  7. RocketMQ最佳实践
  8. 锋利的JQuery(四)
  9. 01-实现图片按钮的缩放、动画效果(block的初步应用)
  10. Richedit使用大全
  11. office2010 office2013打开个别PPT时需要修复的解决方法
  12. hadoop namenode多次格式化后,导致datanode启动不了
  13. EasyPHP的Apache报错
  14. Linux6.X图形界面如何打开终端以及如何将终端加入右键
  15. flannel 网络问题排查
  16. 【ASP.NET Core快速入门】(三)准备CentOS和Nginx环境
  17. 第31月 第9天 责任链AppDelegate
  18. mysql查找字段在哪个表中
  19. jQuery中each循环的跳出和结束
  20. sql两表连接

热门文章

  1. namenode format
  2. Java Hibernate中的悲观锁和乐观锁的实现
  3. Linux-CentOS 查看(监控)服务器网卡流量
  4. HDU - 6357 Hills And Valleys(DP)
  5. ArcGis Python脚本——批量添加字段
  6. SpringBoot系列: Json的序列化和反序列化
  7. 完全使用UDP登录Linux
  8. GBK 字符集
  9. Sqlserver直接附加数据库和设置sa密码
  10. 十一、移植优化---CONFIG 优化进 menuconfig(1)