##c++ 多态:
多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。
C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。
demo:
#include "stdafx.h"
#include <iostream>
class Father {
protected:
int money = 100;
public:
void have() {
std::cout << "Father have money:" << money << "$." << std::endl;
}
};
class Son :public Father {
public:
void have() {
std::cout << "Son have money:" << money << "$." << std::endl;
}
};
class Daughter :public Father {
public:
void have() {
std::cout << "Daughter have money:" << money << "$." << std::endl;
}
};
int main()
{
Son son_;
son_.have();
Daughter dauther_;
dauther_.have();
std::cout << "-------------------------" << std::endl;;
Father* father_ = &son_;
father_->have();
father_ = &dauther_;
father_->have();
system("pause");
return 0;
}
是不是和想象的输出结果不一样.
原因是,调用函数 have() 被编译器设置为基类中的版本,这就是所谓的静态多态,
或静态链接 - 函数调用在程序执行前就准备好了。有时候这也被称为早绑定,因为 have() 函数在程序编译期间就已经设置好了。
所以我们要改为 动态的多态 后绑定
###虚函数:
虚函数 是在基类中使用关键字 virtual 声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器
不要静态链接到该函数。
我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。
我们把基类的 have 前面加 virtual
virtual void have()
再来执行一下
这就对了
此时,编译器看的是指针的内容
,而不是它的类型。因此,由于 son_ 和 dauther_
类的对象的地址存储在 *father_中
,所以会调用各自的 have() 函数
。
正如您所看到的,每个子类都有一个函数 have() 的独立实现。这就是多态的一般使用方式。有了多态,您可以有多个不同的类,都带有同一个名称但具有不同实现的函数,函数的参数甚至可以是相同的。
98年菜鸡一枚,请大佬们多多关照!