在面向对象领域,多态的真正含义是:使用指向父类的指针或者引用,能够调用子类的对象。
多态(Polymorphic)性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数。C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖或者称为重写。而重载则是允许有多个同名的函数,而这些函数的参数列表不同,允许参数个数不同,参数类型不同,或者两者都不同。关于多态,简而言之就是用父类的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。
关键字:多态、非多态、虚函数、抽象类、重载、覆盖、隐藏、模板。
在编代码过程中验证了可以为父类指针new子类对象,而不能为子类指针new父类对象。因为子类包含有父类,把子指针赋给父指针时其实只是把子类中父类部分的地址赋给了父类指针而已,而父类里没有包含子类,所以不能赋值。
实例如下:
#include <iostream>
using namespace std;
class A
{
public:
void foo()
{
cout<<"father foo"<<endl;
}
virtual void fun()
{
cout<<"father fun"<<endl;
}
};
class B : public A
{
public:
void foo()
{
cout<<"child foo"<<endl;
}
void fun()
{
cout<<"child fun"<<endl;
}
};
int main(void)
{
A a;
B b;
A* p = &a;
p->foo();//父类指针指向父类的地址
p->fun();//
p = &b;
p->foo();//父类的指针指向子类的地址
p->fun();//
B* ptr = (B*)&a;
ptr->foo();//子类的指针指向父类的地址
ptr->fun();//
ptr = (B*)&b;
ptr->foo();//子类的指针指向子类的地址
ptr->fun();//
class CA
{
public:
virtual ~CA() {cout<<"delete CA"<<endl;}
virtual int GetValue() {return 1;}
};
class CB : public CA
{
public:
~CB() {cout<<"delete CB"<<endl;}
virtual int GetValue() {return 2;}
};
CA* pA = new CB;
cout<<pA->GetValue()<<endl;
delete pA;
/* result:
2
delete CB
delete CA
*/
/*若父类CA中没有将析构函数定义为虚函数,则result:
2
delete CA
由结果看出,如果不将父类CA的析构函数定义为虚函数,则不会调用到子类的析构函数
*/
/*若父类CA中的成员函数GetValue没有定义为虚函数,则result:
1
delete CA
*/
return 0;
}