今天学习了一下多态的有关知识。
在《C++ Primer》书中,多态特性似乎只在书的后半部分 oo 里面提到。虽然是面向对象中很重要的一个概念,但是并未单独开出一个章节来介绍。
网上找了一些多态的介绍和程序,总结如下:
其底层含义是大内存(父类)中套着许多小内存(子类)
// 父类
class animal
{
public:
virtual void enjoy()
{
std::cout << "bark" << std::endl;
}
};
// 子类
class dog:public animal
{
public:
void enjoy()
{
std::cout << "dog" << std::endl;
}
};
如果调用的是小内存(子类)中继承自大内存(父类)的方法,那么会自动调用子类的方法
// 声明一个类型为dog的变量,指向该变量d的animal型指针p来调用多态的函数
dog d;
animal *p = &d;
p->enjoy();
与之对比的是,声明一个animal变量直接调用enjoy方法
// 直接调用父类中enjoy函数
animal dd;
dd.enjoy();
如果借助另外一个类来实现的话:
class lady
{
public:
animal *a;
lady(animal *oo):a(oo){} // 给成员变量a赋值,即a指向animal类型的变量oo
void bark()
{
a->enjoy();
}
};
调用时区分的是传给上述类构造函数的指针是指向父类还是指向子类的
lady anna(new dog()); // 转到类lady的构造函数,anna指向新开辟的dog缓冲区
anna.bark(); // 此时调用bark,是dog类的方法
lady jane(new animal());// 转到类lady的构造函数,anna指向新开辟的animal缓冲区
jane.bark(); // 此时调用bark,是animal类的方法
如此一来,代码的自由度将大大提高。多态不愧是面向对象中最核心的特征。