C++中的虚函数 (一)

2014-11-24 00:12:15 · 作者: · 浏览: 11

终于放假了,可以想干嘛干嘛了,今天早上想到以前看过几篇大神的博客,里面提到说用父类的指针去访问子类的函数。。今天早上没什么事,就来验证一下。


[cpp]
#include
using namespace std;
class Base
{
public:
Base()
{
cout<<"initial Base Class"< }
void name()
{
cout<<"Base Class name"< }

};
class Derived1:public Base
{
public:
Derived1()
{
cout<<"initial Derived Class"< }
void name()
{
cout<<"Derived1 Class name"< }
};
int main()
{
Derived1 Derived1Class;
Derived1Class.name();
//这个当然是可以正常运行的

Base* BaseClassPointer;
BaseClassPointer=(Base*)&Derived1Class;
BaseClassPointer->name();
//这样相当于把子类转换为父类类型,然后去调用父类的name函数
return 0;
}

#include
using namespace std;
class Base
{
public:
Base()
{
cout<<"initial Base Class"< }
void name()
{
cout<<"Base Class name"< }

};
class Derived1:public Base
{
public:
Derived1()
{
cout<<"initial Derived Class"< }
void name()
{
cout<<"Derived1 Class name"< }
};
int main()
{
Derived1 Derived1Class;
Derived1Class.name();
//这个当然是可以正常运行的

Base* BaseClassPointer;
BaseClassPointer=(Base*)&Derived1Class;
BaseClassPointer->name();
//这样相当于把子类转换为父类类型,然后去调用父类的name函数
return 0;
}

运行结果


[cpp]
initial Base Class
initial Derived Class //初始化Deerived类
Derived1 Class name //调用Derived类的name()
Base Class name //发生强制转换,最终调用的是基类的name()

initial Base Class
initial Derived Class //初始化Deerived类
Derived1 Class name //调用Derived类的name()
Base Class name //发生强制转换,最终调用的是基类的name()
在不使用虚函数的情况下,用基类的指针去访问子类的函数。这样做就相当于把Derived1类型的对象强制转换为Base类型的,所以函数最终调用的是基类中的name()函数。

使用虚函数就可以实现用基类的指针去访问子类的函数,代码如下:


[cpp]
#include
using namespace std;
class Base
{
public:
Base()
{
cout<<"initial Base Class"< }
virtual void name() //用虚函数来实现
{
cout<<"Base Class name"< }
virtual ~Base()
{
}
};
class Derived1:public Base
{
public:
Derived1()
{
cout<<"initial Derived Class"< }
void name()
{
cout<<"Derived1 Class name"< }
~Derived1()
{
}
};
int main()
{
Derived1 Derived1Class;
Derived1Class.name();
//这个当然是可以正常运行的

Base* BaseClassPointer = (Base*)&Derived1Class;
BaseClassPointer->name();
return 0;
}

#include
using namespace std;
class Base
{
public:
Base()
{
cout<<"initial Base Class"< }
virtual void name() //用虚函数来实现
{
cout<<"Base Class name"< }
virtual ~Base()
{
}
};
class Derived1:public Base
{
public:
Derived1()
{
cout<<"initial Derived Class"< }
void name()
{
cout<<"Derived1 Class name"< }
~Derived1()
{
}
};
int main()
{
Derived1 Derived1Class;
Derived1Class.name();
//这个当然是可以正常运行的

Base* BaseClassPointer = (Base*)&Derived1Class;
BaseClassPointer->name();
return 0;
}
运行结果:


[cpp]
initial Base Class
initial Derived Class //初始化Derived类的两个部分
Derived1 Class name
Derived1 Class name //最终调用的是Derived类的name()

Process returned 0 (0x0) execution time : 0.018 s
Press any key to continue.

initial Base Class
initial Derived Class //初始化Derived类的两个部分
Derived1 Class name
Derived1 Class name //最终调用的是Derived类的name()

Process returned 0 (0x0) execution time : 0.018 s
Press any key to continue.

在类的继承中,如果有基类指针指向派生类,那么用基类指针delete时,如果不定义成虚函数,派生类中派生的那部分无法析构。

因此如果设计一个可