终于放假了,可以想干嘛干嘛了,今天早上想到以前看过几篇大神的博客,里面提到说用父类的指针去访问子类的函数。。今天早上没什么事,就来验证一下。
[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时,如果不定义成虚函数,派生类中派生的那部分无法析构。
因此如果设计一个可