c++为何基类的析构函数要么定义为保护的公有成员函数,要么定义为虚函数,或是纯虚函数?

c++为何基类的析构函数要么定义为保护的公有成员函数,要么定义为虚函数,或是纯虚函数?这是老师出的问题其中一道,老师很嚣张,说我们答不出,哪位c++的前辈可以帮帮忙啊,小... c++为何基类的析构函数要么定义为保护的公有成员函数,要么定义为虚函数,或是纯虚函数?
这是老师出的问题其中一道,老师很嚣张,说我们答不出,
哪位c++的前辈可以帮帮忙啊,小弟不胜感激
要举例子啊,麻烦了
展开
 我来答
风骚的可乐
2007-12-10 · TA获得超过1550个赞
知道小有建树答主
回答量:412
采纳率:0%
帮助的人:611万
展开全部
虚拟析构函数

在下面的函数中我们如下应用delete 表达式
void doit_and_bedone ( vector< Query* > *pvec )
{
// ...
for ( ; it != end_it; ++it )
{
Query *pq = *it;
// ...
delete pq;
}
}
为了使函数能够正确执行,在应用delete 表达式时,必须调用pq 指向的动态类型的析构函数。为此,必须把Query 类析构函数声明为虚拟的。
class Query {
public:
virtual ~Query() { delete _solution; }
// ...
};
现在,每个后来派生的类的析构函数都被自动调用,doit_and_bedone()正确执行。
在继承机制下的析构函数的行为如下:派生类的析构函数先被调用。在pq 的情况下,它是一个虚拟函数调用。完成之后,直接基类的析构函数被静态调用——如果被声明为inline,则被内联展开。例如,如果pq 指向一个AndQuery 对象:
delete pq;
则通过虚拟机制调用AndQuery 析构函数。然后再静态调用BinaryQuery 析构函数。而这之后Query 析构函数也被静态调用。

已知下列类层次结构
class Query {
public: // ...
protected:
virtual ~Query();
// ...
};
class NotQuery : public Query {
public:
~NotQuery();
// ...
};
当通过NotQuery 对象调用NotQuery 析构函数时,它的访问级别是public,但是,当通过Query 指针或引用来调用析构函数时,它是protected。即虚拟函数承接了“调用者所属类类型”的访问级别。因此:
int main()
{
Query *pq = new NotQuery;
// 非法: 析构函数是 protected
delete pq;
}
作为一般规则,我们建议将类层次结构的根基类(声明了一个或多个虚拟函数)的析构函数声明为虚拟的。但是,不像基类的构造函数,一般地,基类的析构函数不应该是protected。

参考资料: C++ Primer

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
九色优选官号
2007-12-30 · TA获得超过333个赞
知道小有建树答主
回答量:317
采纳率:0%
帮助的人:469万
展开全部
在下面的函数中我们如下应用delete 表达式
void doit_and_bedone ( vector< Query* > *pvec )
{
// ...
for ( ; it != end_it; ++it )
{
Query *pq = *it;
// ...
delete pq;
}
}
为了使函数能够正确执行,在应用delete 表达式时,必须调用pq 指向的动态类型的析构函数。为此,必须把Query 类析构函数声明为虚拟的。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wangsq_8702
2007-12-10 · TA获得超过8874个赞
知道小有建树答主
回答量:3248
采纳率:33%
帮助的人:813万
展开全部
1、以下赋值语句中,合法的是( )。
A.a=b=58; B.i++; C.a=58,b=58; D.k=int(a+b);
答案为什么是A,B、C、D怎么就不合法了?
2、下列关于break语句的描述中正确的是( )
A、break语句可用于循环体内,它将退出该次循环
B、break语句可用于switch语句中,它将退出switch语句
C、break语句可用于if体内,它将退出if语句
D、break语句在一个循环体内可执行几次
答案为什么是C?是不是答案错了?break语句不是只能用在switch语句和循环语句吗?而且在循环或switch的多层嵌套中,break一次只能跳出一层。
3、有下面程序段:
char a[3],b[] = "China";
a = b;
cout<<a<<endl:
则程序运行时输出( )
A)China B)Ch C)Chi D)Chin
答案是B,但是在Visual C++6.0中程序有错,根本无法运行。
4、内部静态变量的作用域是( )
A)定义改静态变量的函数外部
B)定义改静态变量的函数内部
C)定义改静态变量的文件外部
D)定义改静态变量的文件内部
答案为什么是B?静态变量的作用域不是整个程序吗?内部静态变量是什么东西?
5、下列关于成员访问权限的描述中,不正确的是( )
A、公有数据成员和公有成员函数都可以被类对象直接处理
B、类的私有数据成员只能被公有成员函数以及该类的任何友元类或友元函数访问
C、只有类或派生类的成员函数和友元类或友元函数可以访问保护成员
D、保护成员在派生类中可以被访问,而私有成员不可以
答案是B,B为何不正确?
问题补充:对于第一题的D,肯定不是数组,也不是强制类型转换不对。
强制类型转换有两种应用形式,格式分别如下:
1、类型说明符(表达式);
2、(类型说明符)表达式;
1、B不是复职语句,只是自加而已,定义。
c中两个表达式之间用;逗号运算符职能用一个大的结构中。
D应试(int)(a+b)
2、abd错的不行了,至于c,是if中有for是,break直接退出if。(这点很易错,式一下你就明白了。)
3、字符串复制用strcpy,不能直接a=b(-_-||| 太恐怖了)
不过飞的理解题意的话,我觉得是由‘\0’所以少了一位。
4、静态变量的作用域不是整个程序吗?那是他的时间与整个程序一致,空间上只能在函数内。这题太基本了,好像。
5、还有protect(被保护成员函数)访问也可以的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
123262030
2007-12-10
知道答主
回答量:13
采纳率:0%
帮助的人:0
展开全部
可虚!!!
这中标准早在ANSI C++ 92就引入(也可能更早,我是那时学的)
但……
virtual construct function跟正常的virtual function是有很大差别的但行为是相同的
1. 虚的构造函数要显式指明调用到哪一层基类,也就是说你可以不调用你的父类的构造函数而使用爷爷类的构造函数( 这一点我不知道有什么价值?)
2. 虚的构造函数就是函数,一般构造函数是过程,不知道这样讲对不对但就父类构造函数可跃过说来就说明只要是虚的构造函数就可以不调用,而且它构造的方向是反向的,这好像连系到一系列复杂问题,建议去看看Herbert的C++语言大全,里面有详细介绍
3. 还有一个有意思的事,CBuilder似乎违反了这一规定,它VCL所有的类都要有一个虚的构造函数??是不是因为VCL不是用C++写的??还是规定又有变化?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
newghost_joe
2007-12-21 · TA获得超过791个赞
知道小有建树答主
回答量:1915
采纳率:0%
帮助的人:1136万
展开全部
为防止子类析构时直接调用基类析构,加 virtual 不就是为了运行时区分类别么,那么,例如父指针指向子地址时,对该地址进行析构,你说调用谁呢,如果不加virtual ,调用的就是父类的,那么子类的数据怎么释放呢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式