社区
C++ 语言
帖子详情
这样的函数是否是虚函数????
hufanxp
2004-12-14 09:34:06
class base{
virtual ~base();//虚函数
}
class Derived : public base
{
~Derived(); // 是否是虚函数?
}
...全文
204
18
打赏
收藏
这样的函数是否是虚函数????
class base{ virtual ~base();//虚函数 } class Derived : public base { ~Derived(); // 是否是虚函数? }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
方健的专栏
2004-12-14
打赏
举报
回复
基类的析构函数声明为虚函数是为了调用其派生类的析构函数,派生类的析构函数不是虚函数
xingxinghao
2004-12-14
打赏
举报
回复
楼上的朋友调试过了 ,结果证明了是。
在调用派生类的析构函数时,是先调用派生类的析构函数,再调用基类的析构函数。
根据楼上朋友写的:int main()
{
derived* p = new C;
delete p;
return 0;
}
VC71下面输出:
C::~C
derived::~derived
base::~base
HP_UNIXxiami下面也是
G++也是,如果把derived的:public base注释掉,则只输出
derived::~derived了
可知,如果不是虚函数的话,他的输出结果是为:derived::~derived
base::~base
一路奔跑
2004-12-14
打赏
举报
回复
是di
dudu妈
2004-12-14
打赏
举报
回复
class base{
virtual ~base();//虚函数
}
class Derived : public base
{
~Derived(); // 不是虚函数,是析构函数
}
不是虚函数,是析构函数
minanqiang
2004-12-14
打赏
举报
回复
声明为virtual的虚函数。
析构函数要是虚函数的话前面也会加上virual
class base{
virtual ~base();//虚函数
}
class Derived : public base
{
~Derived(); // 是否是虚函数? 不是虚函数。
}
Kendiv
2004-12-14
打赏
举报
回复
是虚函数,楼上的朋友已经说得很清楚了。
liem
2004-12-14
打赏
举报
回复
从行为上看是虚函数吧,如:
class base{
public:
virtual ~base(){cout<<"base "<<endl;}
};
class Derived : public base
{
public:
~Derived(){cout<<"derived"<<endl};
};
class Last:public Derived
{
public:
~Last(){cout<<"Last"<<endl;}
};
void f(Derived *p)
{
delete p;
}
void main()
{
Last *d=new Last;
f(d);
}
运行后输出:
Last
Derived
base
======
如果~Derived 不是虚的,那么将不会有"Last"的输出,现有输出,这表明虚函数起作用了。
lattice
2004-12-14
打赏
举报
回复
是的,些个例子测试一下就知道了.
class base
{
public:
virtual ~base(){cout<<"base::~base"<<endl;}
};
class derived//:public base
{
public:
~derived(){cout<<"derived::~derived"<<endl;}
};
class C:public derived
{
public:
~C(){cout<<"C::~C"<<endl;}
};
int main()
{
derived* p = new C;
delete p;
return 0;
}
VC71下面输出:
C::~C
derived::~derived
base::~base
HP_UNIXxiami下面也是
G++也是,如果把derived的:public base注释掉,则只输出
derived::~derived了
goodluckyxl
2004-12-14
打赏
举报
回复
ft
没在意是析构函数
自动继承为虚
不好意思搞错了
hchinside
2004-12-14
打赏
举报
回复
绝对是
lu1172101275
2004-12-14
打赏
举报
回复
that is the way ! 这是继承类的虚析构函数特定写法。
DiabloWalkOnTheEarth
2004-12-14
打赏
举报
回复
是
hufanxp
2004-12-14
打赏
举报
回复
哦,3ks!
goodluckyxl
2004-12-14
打赏
举报
回复
显然没有声明为virtual
要显式声明
langzi8818
2004-12-14
打赏
举报
回复
en
licki
2004-12-14
打赏
举报
回复
不是
snow810211
2004-12-14
打赏
举报
回复
刚看过书,基类声明了就可以了,子类继承过来了,所以不用声明,也是virtual
updd
2004-12-14
打赏
举报
回复
其实是不是都没有影响。
如果是delete指向派生类的指针,那基类析构函数是虚的了,就会按派生类-基类的顺序析构。
如果是其他的,也跟派生类是不是虚构没有关系。
所以就使用上来说,派生类析构申明为虚与否都没有关系,只要把基类析构函数申明为虚就可以了。
不知道我的理解有没有不周到的地方啊
虚
函数
和纯
虚
函数
的区别
首先:强调一个概念 定义一个
函数
为
虚
函数
,不代表
函数
为不被实现的
函数
。 定义他为
虚
函数
是为了允许用基类的指针来调用子类的这个
函数
。 定义一个
函数
为纯
虚
函数
,才代表
函数
没有被实现。 定义纯
虚
函数
是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个
函数
。 1、简介 假设我们有下面的类层次: class A { public: virtual void foo
虚
函数
与纯
虚
函数
的区别
虚
函数
(impure virtual) C++的
虚
函数
主要作用是“运行时多态”,父类中提供
虚
函数
的实现,为子类提供默认的
函数
实现。 子类可以重写父类的
虚
函数
实现子类的特殊化。 如下就是一个父类中的
虚
函数
:class A { public: virtual void ss() { cout<<"我是基类的
虚
函数
"<<endl; } };纯虚函
虚
函数
、纯
虚
函数
、多态
如果析构
函数
不被声明为
虚
函数
,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构
函数
而不调用派生类析构
函数
,这样会造成派生类析构不完全,造成内存泄漏。由于我们只知道父类的类型,编译器无法确定指针指向的是哪个子类对象,因此只能调用父类的析构
函数
来释放资源。因为多态允许我们以统一的方式处理不同的派生类对象,并且在运行时确定要调用的方法。相反,它会在运行时根据对象的实际类型来选择正确的
函数
版本。这种机制允许多态性(Polymorphism)的实现,允许不同的派生类以不同的方式实现相同的虚拟
函数
。
哪些
函数
可以成为
虚
函数
,哪些
函数
不可以成为
虚
函数
一,什么是
虚
函数
拥有 Virtual 关键字的
函数
称之为
虚
函数
虚
函数
的作用是实现动态绑定的,也就是说程序在运行的时候动态的的选择合适的成员
函数
那么,有哪些
函数
可以成为
虚
函数
?那些
函数
不可以成为
虚
函数
? 要成为
虚
函数
必须满足两点,一就是这个
函数
依赖于对象调用,因为
虚
函数
就是依赖于对象调用,因为
虚
函数
是存在于
虚
函数
表中,有一个
虚
函数
指针指向这个虚表,所以要调用
虚
函数
,必须通过
虚
函数
指针,而
虚
函数
指针是存在于对象中的。二就是这个
函数
必须可以取地址,因为我们的
虚
函数
表中存放的是
虚
函数
函数
入口地址,如果
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章