析构函数声明为protected的原因

原帖:点击打开链接

对于堆中的对象,我们通常用new/delete来创建/销毁。当调用new时,它会自动去调用相应类的构造函数。同样,当调用delete时,它会自动去调用相应类的析构函数。当我们在栈中产生对象时,前面说的过程是自动完成的。即:不需要我们显式调用new/delete。这里有个前提:类的构造/析构都是public的。

然而,当我们想禁止在栈中产生对象时,如何来实现呢?

将构造函数设为private行吗?no!这样对象虽然不能在栈中产生,但同样也不能在堆中产生了。

将析构函数设为private行吗?bad!这样虽然限制了栈对象,但同时也限制了继承。

将析构函数设为protected行吗?yes!

例如:

class A

{  

protected:   

           A() { }

    ~A() { }  

public:   

         static A* create()

   {    return new A() ;//调用保护的构造函数   }   

         void destroy()   

         {    delete this ;//调用保护的析构函数   }

};

我们可以这样来使用它:

A* pa= A::create();

pa->destroy() ;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,如果一个类中有虚函数,我们通常都会将它的函数设为虚函数。虚函数是指在基类中将函数声明为虚函数,这样在删除指向派生类对象的基类指针时,会调用派生类的函数。 需要虚函数的主要原因是防止内存泄漏。当我们在使用多态时,通常会使用基类指针来指向派生类对象,这时如果函数不是虚函数,删除指向派生类对象的基类指针时,只会调用基类的函数,而不会调用派生类的函数。这就会导致派生类中申请的动态内存无法被释放,从而造成内存泄漏。 使用虚函数可以保证在删除指向派生类对象的基类指针时,会先调用派生类的函数,从而保证所有动态内存都能正确释放。 举个例子,假设我们有一个基类 Animal 和一个派生类 Cat。Animal 类中有一个指针类型的成员变量,指向一个动态分配的字符串。Cat 类继承自 Animal 类,并且重载了函数。如果 Animal 类的函数不是虚函数,那么在删除指向 Cat 对象的 Animal 指针时,只会调用 Animal 类的函数,从而导致 Cat 类中申请的动态内存无法被释放,造成内存泄漏。 ```c++ class Animal { public: Animal() { name = new char[20]; strcpy(name, "Animal"); } ~Animal() { delete[] name; cout << "Animal destructor" << endl; } protected: char* name; }; class Cat : public Animal { public: Cat() { name = new char[20]; strcpy(name, "Cat"); } ~Cat() { delete[] name; cout << "Cat destructor" << endl; } }; int main() { Animal* p = new Cat(); delete p; // Animal destructor,没有调用 Cat 的函数,造成内存泄漏 return 0; } ``` 如果将 Animal 类的函数声明为虚函数,那么在删除指向 Cat 对象的 Animal 指针时,就会先调用 Cat 类的函数,从而正确释放动态内存。 ```c++ class Animal { public: Animal() { name = new char[20]; strcpy(name, "Animal"); } virtual ~Animal() { // 声明为虚函数 delete[] name; cout << "Animal destructor" << endl; } protected: char* name; }; class Cat : public Animal { public: Cat() { name = new char[20]; strcpy(name, "Cat"); } ~Cat() { delete[] name; cout << "Cat destructor" << endl; } }; int main() { Animal* p = new Cat(); delete p; // Cat destructor,然后 Animal destructor return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值