c++虚函数的疑惑。

来源:百度知道 编辑:UC知道 时间:2024/05/16 12:14:58
我有下面的代码啊,很郁闷啊。

#include <iostream>
using namespace std;
class CParent
{
public:
CParent()
{
Init();
}
virtual void Init()
{
cout<<"CParent::Init();\n";
}
virtual void Finalize()
{
cout<<"CParent::Finalize();\n";
}
~CParent()
{
Finalize();
}
};

class CChild:public CParent
{
public:
CChild() { }
virtual void Init()
{
cout<<"CChild::Init();\n";
}
virtual void Finalize()
{
cout<<"CChild::Finalize();\n";
}
~CChild(){}
};

int main()
{
CParent parent;
CChild child
return 0;
}

汗,别把虚函数和纯虚函数给搞混了。
简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行分离;用形象的语言来解释就是实现以共同的方法,但因个体差异而采用不同的策略。
纯虚函数是一种特殊的虚函数,是不能实例化的,也就是说它只能给出一个函数定义,但是不能给出函数的具体实现方式。主要是用来设计派生类的共有接口的。
回到你这个问题上。当变量child构造的时候,他应该先构造CParent,也就是调用Init函数。然后是在CParent中调用CParent类中的Init函数的,所以输出CParent::Init();了。虚函数除了在多态上与类中的其他函数不一样外,其他的用法是一样的。而你的child构造函数中并没有调用child类中的Init函数,所以就没有显示CChild::Init(); 了。就算你调用了,也会先显示CParent::Init(); 再显示CChild::Init();

因为你的这个程序,子类的构造函数和析构函数里面没有调用init和finalize
如果调用了的话,结果不是你这样的,请看我后面的程序和输出。

当child构造的时候,他应该先构造CParent,也就是调用Init函数,没错。
这是个虚函数,所以调用CParent::Init(),因为在构造CParent的时候调用的。

如果在CParent类里面调用,就调用CParent::init
如果在CChild类里面调用,就调用CChild::init
这才是“多态”啊,否则的话,怎么用虚函数实现多态呢??!!

请看这个程序以及它的输出:

#include <iostream>
using namespace std;
class CParent
{
public:
CParent()
{
Init();
}

virtual void Init()
{
cout&