返回   cpper编程论坛 > Zion/测试
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

Zion/测试 惹人烦的东西这边来

回复
 
LinkBack 主题工具 显示模式
  #1 (permalink)  
旧 2004-04-21
高级会员
 
注册日期: 2003-11-02
帖子: 682
andy84920 正向着好的方向发展
发送 MSN 消息给 andy84920
默认 关于析构函数调用?

代码:
class A{ protected: virtual ~A(){} }; class B: public A{ }; A *pb = new B; delete pb;
delete pb不是会去调用~B() 吗?
然后在~B()中去调用~A()这样。还是它在类外调用~A()(调用完~B()之后)?这样编译不过应该是属性后者吧。
这两个析构函数是如何组织的?(如何调用的)。

BTW:为什么class的默认派生是private,而struct的默认派生是public?
class的默认派生如果是public也没什么不好啊?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #2 (permalink)  
旧 2004-04-21
wy 的头像
wy wy 当前离线
高级会员
 
注册日期: 2004-03-17
帖子: 518
wy 正向着好的方向发展
默认

在那两个析构函数里加一句:TRACE("....\n"),打出来看看
struct是public,我觉得struct主要用来做结构,里面的成员都要能被外面访问,所以弄成public,class主要用来封装内部的东西,所以设成private吧
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #3 (permalink)  
旧 2004-04-21
高级会员
 
注册日期: 2003-11-02
帖子: 682
andy84920 正向着好的方向发展
发送 MSN 消息给 andy84920
默认

引用:
作者: wy
在那两个析构函数里加一句:TRACE("....\n"),打出来看看
struct是public,我觉得struct主要用来做结构,里面的成员都要能被外面访问,所以弄成public,class主要用来封装内部的东西,所以设成private吧
我的意思是delete pb;时是这样调用:
operator delete()
{
~B();
~A();
// ...
}
还是会把~B()与~A()不放在一起的其它形式调用?
代码:
#include <iostream> using namespace std; class A{ protected: virtual ~A(){cout << "A" << endl;} }; class B: public A{ ~B(){cout << "B" << endl; } //私有也可以只有警告,dev-cpp4.9.8 }; int main() { A *pb = new B; delete pb; system("PAUSE"); }
如果上面的~B()是私有也可以被delete pb时调用的话那我A中的~A()
是protected在B中就是private的也可以直接调用呀?为什么编译不过?

我怎么觉得class 的默认派生用public没有问题呢?
用private会更好吗?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #4 (permalink)  
旧 2004-04-22
DarkSpy 的头像
高级会员
 
注册日期: 2004-04-08
帖子: 157
DarkSpy 正向着好的方向发展
默认

delete pb;

伪码:

pb->~A();
pb->~B();

第二次编译:

pb->~A(); // ooch, protected, can not accessable, error found

狠简单啊,没什么好惊奇的,如果你设置了编译选项是最松的,可以访问私有和保护类型的选项,那就可以编译,否则如果编译器可以编译 pb->~A(); 扔了它.

如果你一定要class默认是共有的,OK:

#define class struct
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #5 (permalink)  
旧 2004-04-22
高级会员
 
注册日期: 2002-10-06
帖子: 178
famel 正向着好的方向发展
默认

引用:
作者: DarkSpy
delete pb;

伪码:

pb->~A();
pb->~B();
是不是应该反过来?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #6 (permalink)  
旧 2004-04-22
高级会员
 
注册日期: 2003-11-02
帖子: 682
andy84920 正向着好的方向发展
发送 MSN 消息给 andy84920
默认

引用:
作者: DarkSpy
delete pb;

伪码:

pb->~A();
pb->~B();

第二次编译:

pb->~A(); // ooch, protected, can not accessable, error found

狠简单啊,没什么好惊奇的,如果你设置了编译选项是最松的,可以访问私有和保护类型的选项,那就可以编译,否则如果编译器可以编译 pb->~A(); 扔了它.

如果你一定要class默认是共有的,OK:

#define class struct
如果可以直接调用~B()的话,那我那个A中的保护成员然后被B类public继承也应该可以在delete pb时直接调用~A()呀?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #7 (permalink)  
旧 2004-04-22
DarkSpy 的头像
高级会员
 
注册日期: 2004-04-08
帖子: 157
DarkSpy 正向着好的方向发展
默认

引用:
作者: famel
引用:
作者: DarkSpy
delete pb;

伪码:

pb->~A();
pb->~B();
是不是应该反过来?
不是,因为是继承
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #8 (permalink)  
旧 2004-04-22
高级会员
 
注册日期: 2003-09-21
帖子: 104
完美废人 正向着好的方向发展
默认

多态机制不受访问权限限制。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #9 (permalink)  
旧 2004-04-22
高级会员
 
注册日期: 2003-11-02
帖子: 682
andy84920 正向着好的方向发展
发送 MSN 消息给 andy84920
默认

TO DarkSpy:
怎么会是这样调用啊?
不是先派生类后基类吗?

TO 完美废人:
不受访问权限限制就可以访问基类的~A()喽(protected成员)?
但为什么不行哪?你的话是这个意思么?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #10 (permalink)  
旧 2004-04-22
DarkSpy 的头像
高级会员
 
注册日期: 2004-04-08
帖子: 157
DarkSpy 正向着好的方向发展
默认

完美废人,我倒是第一次听说多态不受限制,请告知一二
在 new 的时候,编译器就已经发现是 protected 了,怎么还可能给你编译下去


我自己写的代码把你的代码搞混了,我的 B 是 Base 的意思。寒自己

pa->~A(); // 派生类
pa->~B(); // 基类
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #11 (permalink)  
旧 2004-04-22
高级会员
 
注册日期: 2003-09-21
帖子: 104
完美废人 正向着好的方向发展
默认

抱歉,说错了。我是说,
代码:
class Base{protected:~Base(){}}; class Derived :public Base {public: ~Derived(){}};
没有问题。外界不会直接访问 Base::~Base()。这样也可以防止构造 Base 对象。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #12 (permalink)  
旧 2004-04-23
DarkSpy 的头像
高级会员
 
注册日期: 2004-04-08
帖子: 157
DarkSpy 正向着好的方向发展
默认

像 Base * pb = new Deriverd 怎么办,必定要构造一个 Base + Derived,发现 Base 的 dtor 被 protected。。。。。。

当然直接 deriverd 实例化是没问题的,这和是否 private 无关。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #13 (permalink)  
旧 2004-04-23
codinggirl 的头像
高级会员
 
注册日期: 2002-09-16
帖子: 1,052
codinggirl 正向着好的方向发展
默认 Re: 关于析构函数调用?

引用:
作者: andy84920
代码:
class A{ protected: virtual ~A(){} }; class B: public A{ }; A *pb = new B; delete pb;
delete pb不是会去调用~B() 吗?
是会自动调用~B()呀(只不过你没明白写出来,编译器白送了你一个),这有什么问题吗?你在问问题之前有没有仔细的看看书??
class A{
protected:
virtual ~A(){}
};
......
A *pb = new B;
delete pb;
这种代码你的GCC编译器竟然放过去了?为什么不在问之前简单的写一个示范代码?这好象不难吧。你不是告诉我你在问之前都仔细考虑过并且百思不得其解了吗?类似这种问题发在这里问,你说是让别人怀疑你在说谎好还是让人怀疑你智商好?

引用:
作者: andy84920
然后在~B()中去调用~A()这样。还是它在类外调用~A()(调用完~B()之后)?这样编译不过应该是属性后者吧。这两个析构函数是如何组织的?(如何调用的)。
http://www.allaboutprogram.com/bb/vi...=1687&start=30
你懒的看书,这里人家pomb都仔仔细细的给你讲了析构函数的调用顺序了,你自己去看看吧,一次两次可以,你经常这样问,你提高会快吗?
引用:
作者: andy84920
BTW:为什么class的默认派生是private,而struct的默认派生是public?
class的默认派生如果是public也没什么不好啊?
你去问C++标准委员会为什么不可以吧,或许可以拿拿图灵奖。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #14 (permalink)  
旧 2004-04-23
polyrandom 的头像
超级版主
 
注册日期: 2002-09-03
帖子: 3,138
文章: 20
polyrandom 正向着好的方向发展
默认

andy喜欢的只是问问题,而不是搞懂,所以他不会仔细的看别人的回复。事实上他问的东西书上有,要是仔细看书,早就不会问了。
至于他贴出的代码,编译不过,已经不是第一次了。反正你花时间去查证,又不浪费他的力气。这次算了,以后如果他再有类似的帖子,如果没写编译器,你在VC的几个版本上编译出问题后,也别试验GCC了,直接Zion吧。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #15 (permalink)  
旧 2004-04-23
高级会员
 
注册日期: 2003-11-02
帖子: 682
andy84920 正向着好的方向发展
发送 MSN 消息给 andy84920
默认

引用:
作者: andy84920
引用:
作者: wy
在那两个析构函数里加一句:TRACE("....\n"),打出来看看
struct是public,我觉得struct主要用来做结构,里面的成员都要能被外面访问,所以弄成public,class主要用来封装内部的东西,所以设成private吧
我的意思是delete pb;时是这样调用:
operator delete()
{
~B();
~A();
// ...
}
还是会把~B()与~A()不放在一起的其它形式调用?
代码:
#include <iostream> using namespace std; class A{ protected: virtual ~A(){cout << "A" << endl;} }; class B: public A{ ~B(){cout << "B" << endl; } //私有也可以只有警告,dev-cpp4.9.8 }; int main() { A *pb = new B; delete pb; system("PAUSE"); }
如果上面的~B()是私有也可以被delete pb时调用的话那我A中的~A()
是protected在B中就是private的也可以直接调用呀?为什么编译不过?

我怎么觉得class 的默认派生用public没有问题呢?
用private会更好吗?
我不知道你们有没有看我的回答WY的.我知道你们理解错了我的意思.看到你们的回复我那个伤心哪........当然不是说你们回的不好.是我的问题,因为
你们有你们的原因,那好像是理所当然,有没有看到我的说的真正的问题的意思吗?我说了那个上面只是警告吧?它是私有的是吧?然后一位好心的同志告诉我说是编译器选项没设的那么严所以让那个delete pb;调用~B()时也过了.那我就想为什么A中的析构函数是protected的然后被派生子类B它不是作为B的private一样吗?那它可以直接就有相当于~B()的一样的身份哪.为何不给这个调用也来个警告然后我可以侥幸的看到运行的程序.

引用:
像 Base * pb = new Deriverd 怎么办,必定要构造一个 Base + Derived,发现 Base 的 dtor 被 protected。。。。。。

当然直接 deriverd 实例化是没问题的,这和是否 private 无关。
你的第一个说Base的dtor被protected,我说我的Derived(在我程序中是B)的dtor还直接private也只是警告呀.当然我不是直接构造delete pb;而是有个动态绑定的过程但我认为不管你如何动态我只看你最后你需要调用哪些函数然后看你有没有权限来调用.我的编译器是dev-cpp4.9.8
你的第二句"当然直接 deriverd 实例化是没问题的,这和是否 private 无关"我就没清楚你的意思是什么.因为我不管把哪里搞成private都不成.因为你说和private没关系,那我就搞成它试试看.



引用:
andy喜欢的只是问问题,而不是搞懂,所以他不会仔细的看别人的回复。事实上他问的东西书上有,要是仔细看书,早就不会问了。
至于他贴出的代码,编译不过,已经不是第一次了。反正你花时间去查证,又不浪费他的力气。这次算了,以后如果他再有类似的帖子,如果没写编译器,你在VC的几个版本上编译出问题后,也别试验GCC了,直接Zion吧。
我想声明我不是这样的.
我在怀疑你们有没有知道我问的问题的意思是什么(当然我知道你们不是有这个义务的,所以我没有其它的意思,我还是很高兴大家来说我的不对,因为我会改).还是我的表达真的有问题.我没说我的代码是好的.如果没有说明当然和大家的是一样的.而且我告诉了编译器,上面不是有吗?

引用:
andy84920 写到:
代码:
class A{
protected:
virtual ~A(){}
};
class B: public A{
};
A *pb = new B;
delete pb;

delete pb不是会去调用~B() 吗?

是会自动调用~B()呀(只不过你没明白写出来,编译器白送了你一个),这有什么问题吗?你在问问题之前有没有仔细的看看书??
class A{
protected:
virtual ~A(){}
};
......
A *pb = new B;
delete pb;
这种代码你的GCC编译器竟然放过去了?为什么不在问之前简单的写一个示范代码?这好象不难吧。你不是告诉我你在问之前都仔细考虑过并且百思不得其解了吗?类似这种问题发在这里问,你说是让别人怀疑你在说谎好还是让人怀疑你智商好?

andy84920 写到:
然后在~B()中去调用~A()这样。还是它在类外调用~A()(调用完~B()之后)?这样编译不过应该是属性后者吧。这两个析构函数是如何组织的?(如何调用的)。

http://www.allaboutprogram.com/bb/vi...=1687&start=30
你懒的看书,这里人家pomb都仔仔细细的给你讲了析构函数的调用顺序了,你自己去看看吧,一次两次可以,你经常这样问,你提高会快吗?
andy84920 写到:
BTW:为什么class的默认派生是private,而struct的默认派生是public?
class的默认派生如果是public也没什么不好啊?

你去问C++标准委员会为什么不可以吧,或许可以拿拿图灵奖。
你看上面的代码是我写的吗?我是引用的啊.只不过我也没看到它没有写~B()我的代码里可有写.

引用:
只不过你没明白写出来,编译器白送了你一个),这有什么问题吗?你在问问题之前有没有仔细的看看书??
我不也不舒服吗.能说我没看书吗?

代码:
class A{ protected: virtual ~A(){} }; ...... A *pb = new B; delete pb;
上面的如果把~A() 的访问级别写为public,尽管B的析构是private这也能直接过,有一个警告而矣.我没说上面的代码可以过的.从我的问题应该可以知道我想问的是为什么这样的代码不会过(如果我的问题说明了我的代码不会过,不多此一举再说代码通不过的吧.
至于你说的叫我看pomb回答的,的确,但他回答是在我发这一帖之后啊,你要我把自己的帖子改一下然后说我看了pomb的回答啦.我...........

引用:
你去问C++标准委员会为什么不可以吧,或许可以拿拿图灵奖
我以为有什么特别的原因.比如更安全哪之类,但我一想觉得是一样的啊.所以才想问一下的.希望理解.

不过谢谢各位的回复.
zion那里是不会有人回答的么?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #16 (permalink)  
旧 2004-04-23
polyrandom 的头像
超级版主
 
注册日期: 2002-09-03
帖子: 3,138
文章: 20
polyrandom 正向着好的方向发展
默认

你确认你看懂了Dev C++的错误信息?你确认你看到的是一个warning??
那么下面这段程序你去编译一下,你也会看到warning的,呵呵。
代码:
int main() { andy84920 andy84920 andy84920 }
我现在已经养成习惯了,只要看到你的帖子,就要准备打开所有安装了的编译器,呵呵。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #17 (permalink)  
旧 2004-04-23
高级会员
 
注册日期: 2003-11-02
帖子: 682
andy84920 正向着好的方向发展
发送 MSN 消息给 andy84920
默认

引用:
作者: PolyRandom
你确认你看懂了Dev C++的错误信息?你确认你看到的是一个warning??
那么下面这段程序你去编译一下,你也会看到warning的,呵呵。
代码:
int main() { andy84920 andy84920 andy84920 }
我现在已经养成习惯了,只要看到你的帖子,就要准备打开所有安装了的编译器,呵呵。
我确认我看懂了.我确认我看到的是一个warning.

代码:
#include <iostream> using namespace std; class A{ public: virtual ~A(){cout << "A" << endl;} }; class B: public A{ // public: ~B(){cout << "B" << endl; } }; int main() { A *pb = new B; delete pb; system("PAUSE"); }
7 D:\NOTE\DEV\ABP\test.cpp [Warning] `class B' only defines a private


代码:
#include <iostream> using namespace std; class A{ protected: virtual ~A(){cout << "A" << endl;} }; class B: public A{ // public: ~B(){cout << "B" << endl; } }; int main() { A *pb = new B; delete pb; system("PAUSE"); }
7 D:\NOTE\DEV\ABP\test.cpp [Warning] `class B' only defines a private
D:\NOTE\DEV\ABP\test.cpp [Warning] In function `int main()':
5 D:\NOTE\DEV\ABP\test.cpp `virtual A::~A()' is protected
14 D:\NOTE\DEV\ABP\test.cpp within this context
不知道我有没有真的看懂.
请指点.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #18 (permalink)  
旧 2004-04-23
polyrandom 的头像
超级版主
 
注册日期: 2002-09-03
帖子: 3,138
文章: 20
polyrandom 正向着好的方向发展
默认

那么既然只有一个warning,你有没有编译出exe来?不妨运行一下看看,呵呵。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #19 (permalink)  
旧 2004-04-23
高级会员
 
注册日期: 2003-11-02
帖子: 682
andy84920 正向着好的方向发展
发送 MSN 消息给 andy84920
默认

引用:
作者: PolyRandom
那么既然只有一个warning,你有没有编译出exe来?不妨运行一下看看,呵呵。
当然有.exe而且运行很正常就是显示B A
我不知道你有没有编译运行,不过可能你手头没有此编译器或比较麻烦不愿意编一下因为你可能知道结果.
但希望你不要总用呵呵来结尾好不好?
这样的确是有点BS的意思.
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #20 (permalink)  
旧 2004-04-23
codinggirl 的头像
高级会员
 
注册日期: 2002-09-16
帖子: 1,052
codinggirl 正向着好的方向发展
默认

代码:
#include <iostream> using namespace std; class A{ protected: virtual ~A(){cout << "A" << endl;} }; class B: public A{ // public: ~B(){cout << "B" << endl; } }; int main() { A *pb = new B; delete pb; system("PAUSE"); }
麻烦把编译出的EXE分别发给我和pora[/quote]
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
回复

书签
主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为格林尼治时间 +9。现在的时间是 08:56 AM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2009,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0