用基类指针指向派生类 调用的还是基类函数,
为什么?
如果想去用父类指针,引用访问子类对象中的成员函数 需要用到虚函数
(基类定义为虚函数 子类不管加不加virtual 相同函数都是虚函数)
虚函数原理?
调试运行会产生一个虚函数指针(vfptr)---涉及到继承 指针指向虚函数表 表中是子类成员方法
虚函数本质是函数指针变量 vfptr虚函数指针 指向虚函数表(vftable):虚函数表存放函数入口地址
但不涉及到继承 vfptr指向自己
虚函数应用实例
c++动态绑定机制?
当编译器发现类中有虚函数时,编译器会自动创建一个虚函数表,把虚函数入口地址放入虚函数表中,
并且在类中秘密增加一个指针,这个指针就是vpointer(缩写vptr),这个指针是指向对象的虚函数表。在多态调用的时候,根据vptr指针,找到虚函数表来实现动态绑定。当对虚函数重写时,虚函数表中的地址也会随之更新, 保证动态绑定是根据实际类型调用正确函数
虚析构
和虚函数同理
只会析构Base 因为Base指针只能调用子类的基类部分 不能调用到子类析构
纯虚函数
格式:
如果一个类拥有纯虚函数那么这个类就是抽象类(不能实例化对象,因为纯虚函数没有具体实现,) 如果继承子类也没有实现那么这个类也是抽象类
案例:饮水制作
#include<iostream>
using namespace std;
class Drinking{
public:
//烧水
virtual void boil()=0;
//冲泡
virtual void brew()=0;
//倒入杯中
virtual void cup()=0;
//加入辅料
virtual void put()=0;
void makedrink()
{
boil();
brew();
cup();
put();
}
};
class coffe:public Drinking{
public:
void boil()
{
cout<<"加入农夫山泉"<<endl;
}
void brew()
{
cout<<"冲咖啡"<<endl;
}
void cup()
{
cout<<"就咖啡倒入杯中"<<endl;
}
void put()
{
cout<<"加入牛奶"<<endl;
}
};
class bbbb:public Drinking{
void boil()
{
cout<<"1"<<endl;
}
void brew()
{
cout<<"2"<<endl;
}
void cup()
{
cout<<"3"<<endl;
}
void put()
{
cout<<"4"<<endl;
}
};
int main()
{
Drinking*p=new coffe;
p->makedrink();
Drinking*b=new bbbb;
b->makedrink();
return 0;
}
纯析构函数(必须实现函数体--类外)
本文含有隐藏内容,请 开通VIP 后查看