65,184
社区成员




class B: public A
{
public:
B( const B& another)
: A(another) // here, you have to explicitly call base class copy ctor.
{
}
};
[/quote]
原来如此,多谢
那10楼中提到的:
么是否可以说,我们的多态在使用的时候,
比如销毁你new出来的对象,就必须dynamic_cast为你的派生类,然后销毁。
对不? 感觉不对啊, 这样太麻烦了啊, 呵呵。
[/quote]
一般不推荐用dynamic_cast,可以定义一个虚函数,让派生类自己销毁。
class Base {
public:
virtual void release() = 0;
};
class Derived: public Base {
private:
virtual void release() { delete this; }
};
[/quote]
聪明, 不过我马上 发现个问题了:
你不觉得不对称吗?
有release ,没有 create什么的?
做个补充:
当基类的析构函数为protected的时候, 可以做以下几个处理:
1. 基类的构造函数,拷贝构造函数,均设置成 protected。
可以达到不能够直接new, delete一个基类的目的。
2. 基类依然需要提供一个create, release函数 ,而且是虚函数
3. 派生类 的构造,拷贝构造均需要搞成 private,通过create去 生成对象,
release释放对象。
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 也编译不过.
class B: public A
{
public:
B( const B& another)
: A(another) // here, you have to explicitly call base class copy ctor.
{
}
};
[/quote]
原来如此,多谢
那10楼中提到的:
么是否可以说,我们的多态在使用的时候,
比如销毁你new出来的对象,就必须dynamic_cast为你的派生类,然后销毁。
对不? 感觉不对啊, 这样太麻烦了啊, 呵呵。
[/quote]
因为你就不该这样用。
class B: public A
{
public:
B( const B& another)
: A(another) // here, you have to explicitly call base class copy ctor.
{
}
};
[/quote]
原来如此,多谢
那10楼中提到的:
么是否可以说,我们的多态在使用的时候,
比如销毁你new出来的对象,就必须dynamic_cast为你的派生类,然后销毁。
对不? 感觉不对啊, 这样太麻烦了啊, 呵呵。
[/quote]
一般不推荐用dynamic_cast,可以定义一个虚函数,让派生类自己销毁。
class Base {
public:
virtual void release() = 0;
};
class Derived: public Base {
private:
virtual void release() { delete this; }
};
class B: public A
{
public:
B( const B& another)
: A(another) // here, you have to explicitly call base class copy ctor.
{
}
};
[/quote]
原来如此,多谢
那10楼中提到的:
么是否可以说,我们的多态在使用的时候,
比如销毁你new出来的对象,就必须dynamic_cast为你的派生类,然后销毁。
对不? 感觉不对啊, 这样太麻烦了啊, 呵呵。
class B: public A
{
public:
B( const B& another)
: A(another) // here, you have to explicitly call base class copy ctor.
{
}
};
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]
你好,你的问题我做了一个引申,
如果基类指针不能被delete ,因为是protected了, 那么是否可以说,我们的多态在使用的时候,
比如销毁你new出来的对象,就必须dynamic_cast为你的派生类,然后销毁。
[/quote]
如果基类的析构 protected 了, 确实是这样.
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]
你好,你的问题我做了一个引申,
如果基类指针不能被delete ,因为是protected了, 那么是否可以说,我们的多态在使用的时候,
比如销毁你new出来的对象,就必须dynamic_cast为你的派生类,然后销毁。