可以看到加了virtual关键字后,父类和子类的大小都变成了四字节,这是因为生成了虚函数指针,指针指向虚函数表,虚函数表存储了虚函数地址,继承了父类的子类重写了虚函数,虚函数表中的函数地址被替换,再次调用虚函数就是调用了子类的函数func。 2、虚析构 虚析构主要是为了解决子类中有属性开辟到堆区,父类指针调用...
虚析构函数是为了解决基类指针指向派生类对象,并用基类指针delete派生类对象,导致的内存泄漏问题。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 classBase { public: Base(){ a = 1; } /...
从程序的运行结果可以看出,父类和子类的内存都被析构了。所以在使用多态时一定要将父类的析构函数定义成虚函数,从而避免内存泄露。
2)虚函数的调用需要虚函数表指针,而该指针存放在对象的内存空间中;若构造函数声明为虚函数,那么由于对象还未创建,还没有内存空间,更没有虚函数表地址用来调用虚函数即构造函数了 2、析构函数最好声明为虚函数 首先析构函数可以为虚函数,当析构一个指向派生类的基类指针时,最好将基类的析构函数声明为虚函数,否...
而不是指向具体实现的指针。当他们删除它时,如果析构函数不是虚拟的,他们将调用接口的析构函数(如果...
4)一个指针可以是volatile 吗?解释为什么。 可以。尽管这并不是很常见。一个例子当中断服务子程序修改一个指向一个buffer的指针时。 下面的函数有什么错误: int square(volatile int *ptr) { return *ptr * *ptr; } 下面是答案: 这段代码有点变态。这段代码的目的是用来返指针*ptr指向值的平方,但是,由于*...
析构函数可以在C ++中纯粹是虚拟的吗? 是的,可以使用纯虚拟析构函数。纯虚拟析构函数在标准C ++中是合法的,其中最重要的一点是,如果类包含纯虚析构函数,则必须为纯虚析构函数提供函数体。如果它需要一个函数体,虚拟函数如何是纯粹的,这似乎很奇怪?但是,总是以类派生的相反顺序调用析构函数。这意味着将首先...
b)多态面试题强化(多态理解、重载重写重定义、为什么要有虚析构函数、构造函数中调用虚函数能实现多态...
who(); // 此处的虚函数是通过指针调用的,呈现多态性,需要在运行时期间才能确定,所以不能为内联。 Base *ptr = new Derived(); ptr->who(); // 因为Base有虚析构函数(virtual ~Base() {}),所以 delete 时,会先调用派生类(Derived)析构函数,再调用基类(Base)析构函数,防止内存泄漏。 delete ptr; ...
who(); // 此处的虚函数是通过指针调用的,呈现多态性,需要在运行时期间才能确定,所以不能为内联。 Base *ptr = new Derived(); ptr->who(); // 因为Base有虚析构函数(virtual ~Base() {}),所以 delete 时,会先调用派生类(Derived)析构函数,再调用基类(Base)析构函数,防止内存泄漏。 delete ptr; ...