c++虚函数

73 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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.然后每次调用都会去表中查找他的地址