帮忙看看这两题

qazxsw1982103 2004-06-13 12:59:22
1.这题会造成内存泄漏吗??(p只是指向基类子对象)
#include<iostream.h>
class test
{
int a;
public:
~test()
{
cout<<"unload test\n";

}
};

class test1:public test
{
public:
int a;
test1()
{
a=100;
}

~test1()
{
cout<<"unload test1\n";
}
};
void main()
{
test *p=new test1;
delete p;
}

输出:unload test


2.为什么静态成员函数不可以被设置为虚拟的??(请大侠详解一下)
...全文
154 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zf0579 2004-06-17
  • 打赏
  • 举报
回复
确切的说由于基类Test并没有分配内存,所以也不需要在析构函数中释放内存。程序所占空间,由系统调用分配、释放。如果你分配内存,就需要你释放。

另外,你的基类最好虚化一下,虽然没有内存泄露,但是可能引起undefinded behavior。
zf0579 2004-06-15
  • 打赏
  • 举报
回复
问题1 参见http://dev.csdn.net/develop/article/14/14348.shtm

问题2 参见《深度探索C++对象模型》
Chapter4 The Sematics of Function
Section4.1 Varieties of Member Invocation/Static Member Functions

the Main reason of question 2 is that the static function will be
translated by compiler without this pointer, but virtual/const
function will have this pointer pointing to the object.
so it is conflict to use virtual/static at the same time.


flj01 2004-06-13
  • 打赏
  • 举报
回复
我看不懂,呵呵……
UnrealImagecoffee 2004-06-13
  • 打赏
  • 举报
回复
动态特性:
在绝大多数的情况下,程序的功能是在编译的时候就确定下来了;我们称为静态特性
反之,如果程序的功能是在运行时刻才确定下来的,称为动态特性
动态特性是面向对象语言最强大的功能之一,因为它在语言级别上支持程序的可扩展性,而可扩展性则是软件设计追求的重要目标之一。
c++的虚函数,抽象基类,动态联编和多态性构成了出色的动态特定

这样 说 明白吗?
加一句:
一旦类的一个函数被声明为虚函数,那么其派生类的对应函数也成为虚函数
MyNameEPC 2004-06-13
  • 打赏
  • 举报
回复
你的程序目前没有内存泄露,那是因为在类中没有指针成员变量。如果有指针成员变量就应该把析构函数变成virtual函数,那就是为什么你的程序没有输出两次unload信息的原因。

static函数不能成为虚函数,那是因为static函数根本不能由类对象来调用,只能通过::操作符调用。多态只能是类对象产生的。
talkingmute 2004-06-13
  • 打赏
  • 举报
回复
第一题,不会造成泄露,如果定义一派生类对象,比如test1 *p=new test1;delete p;
可能就回有意想不到的后果
第二题,静态函数是在内存中占用的静态存储区,在整个程序中都存在的,是一个全局量。你想,如果把它定义为虚函数,就是让它具有动态性的,这不矛盾了吗??
Agemo 2004-06-13
  • 打赏
  • 举报
回复
第一个问题有人已经回答了

第2个问题嘛,真是问得矛盾阿!
静态函数被compiler处理后,参数个数还是那些
但是非静态函数,都要求传入实例指针的

既要求跟实例无关,又要求跟实例有关
试问有这样的统一体吗?
tulading 2004-06-13
  • 打赏
  • 举报
回复
静态成员函数不是属于对象的,而是属于类的,它没有继承的意义
而虚函数目的就是用来继承的
狐帝 2004-06-13
  • 打赏
  • 举报
回复
1. 基类的析构函数应该声明为virtual,这样,在释放对象的时候才会调用派生类的析构函数。这是多态性在析构函数上的反映。如果派生类的析构函数中需要释放某些资源的话,你的程序就有可能导致内存泄露。

2. 静态成员函数是全局的,不可动态联编的,因此不能是虚函数。
qazxsw1982103 2004-06-13
  • 打赏
  • 举报
回复
顶一下

64,685

社区成员

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

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