构造函数和析构函数中调用虚函数

2014-11-24 02:21:14 · 作者: · 浏览: 1

构造函数中调用虚函数:


[cpp] view plaincopyprint
#include
using namespace std;
class Base
{
public:
Base()
{
print();
}
virtual void print()
{
cout<<"Base::Base()\n";
}
};
class Derived :public Base
{
public:
virtual void print()
{
cout<<"Derived::Derived()\n";
}
};
int main()
{
Base B;
Derived D;
}

#include
using namespace std;
class Base
{
public:
Base()
{
print();
}
virtual void print()
{
cout<<"Base::Base()\n";
}
};
class Derived :public Base
{
public:
virtual void print()
{
cout<<"Derived::Derived()\n";
}
};
int main()
{
Base B;
Derived D;
}
运行结果为:
Base::Base();

Base::Base();

对象的基类部分要早于其数据成员,当Derived中的Base部分被构造时,Derived中的其他成员还未被构造,此时调用Derived中的虚函数毫无意义。因为它可能试图去访问Derived中那些还未被初始化的数据成员。

析构函数中使用虚函数:


[cpp] view plaincopyprint
#include
using namespace std;
class Base
{
public:
virtual void print()
{
cout<<"Base::Base()\n";
}
~Base()
{
print();
}
};
class Derived :public Base
{
public:
virtual void print()
{
cout<<"Derived::Derived()\n";
}
};
int main()
{
Base B;
Derived D;
}

#include
using namespace std;
class Base
{
public:
virtual void print()
{
cout<<"Base::Base()\n";
}
~Base()
{
print();
}
};
class Derived :public Base
{
public:
virtual void print()
{
cout<<"Derived::Derived()\n";
}
};
int main()
{
Base B;
Derived D;
}
运行的结构为:
Base::Base()

Base::Base()

在析构函数中,我们调用的总是Base::Print(),即使当摧毁的是Derived中的Base部分时也是如此,当我们调用Base的析构函数时,Derived中的数据成员早已被析构了,因此再去调用Derived中的print也将毫无意义。

Attention:只有在构造函数和析构函数中调用虚函数才会有这种特殊的行为出现,其他情况下都是正常的。