首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

基类的析构函数替保护的时候

2013-08-04 
基类的析构函数为保护的时候1.基类的析构函数为保护的时候为什么要这样设计呢? 不明白有什么意义?而且dele

基类的析构函数为保护的时候
1.  基类的析构函数为保护的时候

为什么要这样设计呢? 不明白有什么意义?

而且delete 基类指针         从语法角度看, 会去调用 基类的析构函数, 此时会protected,

可以调用吗?


2.
 构造函数,析构函数, 拷贝构造, 这3种都可以继承给 派生类吗?



[解决办法]

引用:
Quote: 引用:

1. 基于某种原因不想让你去 delete 基类指针吧. 比如它是一个单件的时候之类的.
2. 不会. 如果派生类没有提供自己的, 编译器会合成一个默认的.



你好,方便讨论下你说第一点吗?

我一般用单件,是派生了继承一个模板类, 就可以了。 此时确实不会 delete 基类指针


好了,居然你说,为protected的话,不可以调用, 只是让派生类去调用 基类的析构函数,达到销毁基类的目的。

我们完全可以将基类的析构 设置为private啊,呵呵



设置为 private 的话派生类也不能销毁了...
举个最简单的单件例子吧:

class B
{
protected:
virtual ~B() {};

};

class D : public B
{
public:
virtual ~D() {};
};

B* get_Sing()
{
static D d;
return &d;
}

int main()
{
B* s = get_Sing();
//delete s; // 出错, 被保护的
}


如果再把上面的 protected 改成 private, D 自己析构的时候都会出错, 注释掉 delete s 也编译不过.
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

1. 一般用来禁止生成基类对象,强制通过派生类使用基类功能,NVI pattern 就用了这招儿。
2. 标准要求派生类构造函数和析构函数调用基类的。自定义复制构造函数的话,需要自己调用。



自定义复制构造函数的话,需要自己调用。

这么说, 派生类的拷贝构造函数,我们也要提供 对基类的拷贝了,  因为基类的拷贝构造函数,已经无法使用了,

派生类不能使用,所谓的不能继承



不懂你说什么,为啥基类的复制构造函数无法使用,写点儿代码秀一下你的观点。


我是按照你的回帖得出的结论啊:

标准要求派生类构造函数和析构函数调用基类的。

自定义复制构造函数的话,需要自己调用。


举个例子:



例子:

class A
{
...
public:

A(const A& onther)
{
}
};

class B: public A
{
public:
B( const B& another)
{
}
};

调用: B obj1;

B ojb2= obj1;  //拷贝构造


如果A中有指针成员,A的拷贝构造代码里也做了深拷贝。

但是B的构造函数代码并没有对继承过来的指针成员做深拷贝,  B的拷贝构造所做的工作仅仅是:

对B类新增加的数据成员做处理, A的成员它不管, B的拷贝构造只提供了处理B新增加的数据成员的代码,

那么此时 B obj2=obj1;  能否获得我们需要的正确结果呢?



我说 "自定义复制构造函数的话,需要自己调用。" 是这个意思。

class B: public A
{
public:
B( const B& another) 
: A(another) // here, you have to explicitly call base class copy ctor.
{
}
};


原来如此,多谢


那10楼中提到的:
么是否可以说,我们的多态在使用的时候,

比如销毁你new出来的对象,就必须dynamic_cast为你的派生类,然后销毁。


对不? 感觉不对啊,  这样太麻烦了啊, 呵呵。


一般不推荐用dynamic_cast,可以定义一个虚函数,让派生类自己销毁。

class Base {
public:
    virtual void release() = 0;
};

class Derived: public Base {
private:
    virtual void release() { delete this; }
};

[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:

1. 一般用来禁止生成基类对象,强制通过派生类使用基类功能,NVI pattern 就用了这招儿。
2. 标准要求派生类构造函数和析构函数调用基类的。自定义复制构造函数的话,需要自己调用。



自定义复制构造函数的话,需要自己调用。

这么说, 派生类的拷贝构造函数,我们也要提供 对基类的拷贝了,  因为基类的拷贝构造函数,已经无法使用了,

派生类不能使用,所谓的不能继承



不懂你说什么,为啥基类的复制构造函数无法使用,写点儿代码秀一下你的观点。


我是按照你的回帖得出的结论啊:

标准要求派生类构造函数和析构函数调用基类的。自定义复制构造函数的话,需要自己调用。


举个例子:


例子:

class A
{
...
public:



A(const A& onther)
{
}
};

class B: public A
{
public:
B( const B& another)
{
}
};

调用: B obj1;

B ojb2= obj1;  //拷贝构造


如果A中有指针成员,A的拷贝构造代码里也做了深拷贝。

但是B的构造函数代码并没有对继承过来的指针成员做深拷贝,  B的拷贝构造所做的工作仅仅是:

对B类新增加的数据成员做处理, A的成员它不管, B的拷贝构造只提供了处理B新增加的数据成员的代码,

那么此时 B obj2=obj1;  能否获得我们需要的正确结果呢?



我说 "自定义复制构造函数的话,需要自己调用。" 是这个意思。

class B: public A
{
public:
B( const B& another) 
: A(another) // here, you have to explicitly call base class copy ctor.
{
}
};


原来如此,多谢


那10楼中提到的:
么是否可以说,我们的多态在使用的时候,

比如销毁你new出来的对象,就必须dynamic_cast为你的派生类,然后销毁。


对不? 感觉不对啊,  这样太麻烦了啊, 呵呵。



因为你就不该这样用。
[解决办法]
create 做成虚函数,这相当于虚构造函数,这不是三言两语可以说清楚的。
真想这样做的话,搜一下虚构造函数这个话题,或者看一下 《Effective C++》,和《More Effective C++》这两本书,具体哪一本书记不住了,其中一本书里讨论了虚构造函数的话题。

热点排行