携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
虚函数
1.构造函数和析构函数能否设置为虚函数?
构造函数不能声明为虚函数,
析构函数最好声明为虚函数,
2.虚函数和多态的实现
子类先是从父类复制了一个虚函数表,如果子类对父类的虚函数进行了覆盖,则在子类的虚函数表将会用子类的函数地址覆盖父类的,
如果没有覆盖,则还是使用父类的函数地址,这样就实现了多态。
#include<iostream>
#include<cstring>
using namespace std;
class Wood{
protected:
string name;
int wight;
public:
Wood(string a,int w){
name=a;
wight=w;
}
virtual void show(){
cout<<"込込込"<<wight<<"込込込"<<endl;
}
};
class Desk :public Wood{
private:
public:
Desk(string a,int w):Wood(a,w){}
void show(){
// cout<<"Hhh "<<name<<endl;
cout<<"hhh"<<endl;
}
};
void test(Wood *p){
p->show();
}
typedef void(*func)() ;
int main(){
Wood w("a",1);
Desk d("aa",11);
int *p=(int*)&d;
printf("%p\n",*p);
printf("%p\n",*((int*)*p) );
func pfunc=(func)*((int*)*p);
pfunc();
return 0;
}
3.虚函数是怎么实现的呢。
4.一个虚函数的类是否仅有一个虚函数表呢。
是
5.虚指针位于类对象的哪里?
前
6.可执行程序的虚拟内存空间的分布。
代码区(Text egment): 全局初始化数据区/静态数据区(Data Segment)未初始化数据区(BSS):4) 堆区(heap):5) 栈区(stack):
7、虚函数的存在是为了解决什么问题?虚函数的原理?使用虚函数可能会产生哪些问题?
虚函数(virtual)是通过虚函数表来实现的,在这个表中,主要是一个类的虚函数的地址表,表解决了继承、覆盖的问题,保证其真实反映实际的函数。
8.总结
## 1.编译器在处理虚函数时 会给每个对象分配一个隐藏的成员,隐藏的成员是一个指针类型的数据 指向的是函数地址的数组
## 2.如果那个派生类没有重写基类的虚函数,则对象的血元素表中保存的是基类的虚函数地址。
## 3.在使用虚函数时,对与内存和执行速度方面会有一定的成本,1.每个对象都会变大,变大的量为虚函数表指针
## 4.对于每个类来说,会创建一个虚函数表。
## 5.然后每次调用都会去表中查找他的地址