关于虚析构函数的访问权限

ywf550230 2011-12-05 11:15:24
请问:为什么具有多态性质的基类的虚析构函数的访问权限必须是public,如果不是public,会带来什么问题呢?谢谢!
...全文
137 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ywf550230 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qscool1987 的回复:]
这个问题测试一下你就知道了,
[/Quote]
能举个例子吗?
ywf550230 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mingliang1212 的回复:]
引用楼主 ywf550230 的回复:
请问:为什么具有多态性质的基类的虚析构函数的访问权限必须是public,如果不是public,会带来什么问题呢?谢谢!


一般是public 但是可以是protected ,private 只要你保证使用到该析构函数的地方有析构函数的访问权限就可以。当是protected 或private 的时候,该类能被实例化的地方就有了限制。
[/Quote]
就析构函数来讲,我怎么觉得protected与public没什么区别呢?
qscool1987 2011-12-05
  • 打赏
  • 举报
回复
这个问题测试一下你就知道了,
iamnobody 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 ywf550230 的回复:]
请问:为什么具有多态性质的基类的虚析构函数的访问权限必须是public,如果不是public,会带来什么问题呢?谢谢!
[/Quote]

一般是public 但是可以是protected ,private 只要你保证使用到该析构函数的地方有析构函数的访问权限就可以。当是protected 或private 的时候,该类能被实例化的地方就有了限制。
ywf550230 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 namelij 的回复:]
我想知道如果非public,那你对象怎么析构?
[/Quote]
protected也行的
  • 打赏
  • 举报
回复
我想知道如果非public,那你对象怎么析构?
如此美丽的你 2011-12-05
  • 打赏
  • 举报
回复
若不是public ,则基类继承后析构函数不可见,对象无法析构。
gongheguoyingpai11 2011-12-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 stendson 的回复:]

在继承的环境里 public和protected都可以因为protected可以被子类访问,但是在组合模式下就不行了,因为此时this不是派生类无法访问基类析构C/C++ code

#include <iostream>
using namespace std;

class Base
{
public:
Base(){}
virtual ~Base()
{
……
[/Quote]
学习了
stendson 2011-12-05
  • 打赏
  • 举报
回复
在继承的环境里 public和protected都可以因为protected可以被子类访问,但是在组合模式下就不行了,因为此时this不是派生类无法访问基类析构

#include <iostream>
using namespace std;

class Base
{
public:
Base(){}
virtual ~Base()
{
cout<<"Base Destructor!"<<endl;
}
};

class Derived : public Base
{
public:
Derived(){}
~Derived()
{
cout<<"Derived Destructor!"<<endl;
}
};

class Factory
{
public:
Factory(){}
~Factory()
{
delete m_pBase; //如果Base析构为protected则无法访问
}
Base* Create()
{
m_pBase = new Derived();
return m_pBase;
}
private:
Base* m_pBase;
};

int main()
{
Base * pB = new Derived();
delete pB;//如果Base析构不是public或protected 则内存泄漏
Factory f;
f.Create();
return 0;
}

wumuzi 2011-12-05
  • 打赏
  • 举报
回复
如果不是public那么这个类只能通过其友元类实例化对象。因为非友元类将导致析构失败,编译通不过。即使是public继承也不行,造成编译失败。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧