【发布时间】:2011-07-12 05:02:08
【问题描述】:
当我使用 Visual Studio 2010 运行以下 C++ 代码时,如果任何派生类函数被声明为虚拟,程序就会停止删除变量。谁能解释一下?
void testInheritance()
{
class a
{
public :
char x;
void fn1()
{
std::cout<<"\n In Class A Function 1 : "<<x;
}
virtual void fn2()
{
std::cout<<"\n In Class A Function 2 : "<<x;
}
a()
{
x='A';
std::cout<<"\n In A() : "<<x;
}
~a()
{
std::cout<<"\n In ~A : "<<x;
}
};
class b: public a
{
public :
char y;
virtual void fn1()
{
std::cout<<"\n In Class B Function 1 : "<<y;
}
void fn3()
{
std::cout<<"\n In Class B Function 3 : "<<y;
}
b()
{
y='B';
std::cout<<"\n In B() : "<<y;
}
~b()
{
std::cout<<"\n In ~B : "<<y;
}
};
a* var = new b();
delete var;
}
更多信息:
我知道要调用 b::fn1 和 b 类的析构函数,我需要在基类(即 a 类)中将它们声明为虚拟。但是,如果我不这样做,甚至不将 b 类(和 a 类)中的任何函数声明为虚拟函数,它应该同时调用 fn1 和 a 的析构函数,并且这完美地发生了。但是,当我将 b(但不是 a)的任何成员声明为虚拟成员时,无论是新成员还是重载成员,它都会在使用 VS2010 编译时挂起,而在 Linux 上使用 gcc4.4.4 编译时会中断。它应该调用了任何一个析构函数并正常工作,但我无法理解程序中断的原因。
在 Visual Studio 2010 中进一步使用 Intellitrace 时,我尝试在代码挂起的地方中断代码,我收到以下消息:
进程似乎已死锁(或未运行任何用户模式代码)。所有线程都已停止。
【问题讨论】:
-
还要注意
a* bb = new b; bb->fn1();将调用a::fn1,因为您忘记在a中的fn1声明之前放置virtual关键字。
标签: c++ visual-studio-2010 inheritance virtual