如何能避免在调用子类对象的虚函数时调用父类的虚函数呢?

RT
//main.cpp
#include <iostream>
using namespace std;
#include "2.h"
void main()
{
b B;
B.~b();
}
//1.h
#include <iostream>
using namespace std;

class a
{
public:
virtual ~a()
{
cout<<"a被析构"<<endl;
}
};
//2.h
#include <iostream>
using namespace std;
#include "1.h "
class b:public a
{
public:
virtual ~b()
{
cout<<"b被析构"<<endl;
}
};
如何不显示“a被析构”?

既然是虚析构函数,函数调用的地址就是在运行时候确定的。
任何一个带有虚函数的类,其任一个实例对象首4字节都保存的虚函数表的地址,当此实例调用其虚成员函数时候,不是直接调用其成员函数地址,而是查找其内存块的头4个字节找虚函数表,根据虚函数表里面此函数的地址来调用相应的函数。
你既然定义的是b B,那么B(是实例,不是类)就有个虚函数表,里面只有一个项目也就是其析构函数的地址。所以析构的时候就调用它了。而普通的析构函数是先调用 ~b(),在调用 ~a();
温馨提示:内容为网友见解,仅供参考
第1个回答  2007-11-26
怎么说呢?其实那跟虚函数没有任何关系的,只是析构函数肯定会执行的缘故。如果你把那个所谓的虚函数修改下,比如改成
vitual fun(){cout<<"1"<<endl;}
后来B继承A之后呢这个虚函数写成
fun(){cout<<"2"<<endl;}
A *x=new B
x->fun(),就可以看到虚函数的真正威力了。
楼主的问题不是虚函数的,而是析构函数的
第2个回答  2007-11-27
在cout<<"b被析构"<<endl; 下面加一句
exit(0);
这才是天才解决问题的方法,虽然有些流氓,但问题解决了
第3个回答  2019-10-27
不可能,除非你不定义a的析构函数。
首先,因为类b是从a派生而来的,在构建类b的对象时,首先构建了a的部分。因为b的对象包含有类a的子对象,你怎么能够做到在b的对象析构是不析构它所包含的基类的子对象呢?除非你去修改编译器。

...的成员函数同名同参数同返回只是父类里面是虚函数,子类没有虚函数限...
没有问题,这就是虚函数的作用,子类中可以override(重写)父类中的虚函数,给出子类自己的实现方法,子类中其实省略了父类函数声明前的virtual,子类中加上virtual也是没有问题的,可有可无。

c++11 新特性总结(一)——关键字篇
为了防止子类重写父类的虚函数,C++11引入了override关键字。在声明子类的虚函数时添加override可以避免不必要的问题,如手误写错函数名导致编译通过但运行时出错的情况。Final关键字用于声明类的特定函数不能被子类重写,为类的某个部分提供不可变性。在类的构造函数管理上,C++11提供了default关键字,用于...

什么时候一定要使用虚函数而不能使用纯虚函数,请举实例。
虚函数主要是用来定义一个函数,且允许这个函数调用的时候,在可能的情况下调用派生类重载的函数。举一个实例的话,就是析构函数。父类可以有一个析构函数来处理父类里面分配的内存之类的事情,派生类也有一个析构函数来处理派生类中的相关事情。于是这就无法使用纯虚函数了。

C++基类子类中,虚函数究竟是怎样判断该调用哪个函数的??
有虚函数时,每个对象的this指针都指向一个虚函数表(Virtual Table)的地址,这个表里存的就是虚函数的地址。编译的时候就决定了,普通函数调用时直接CALL这个函数的地址,而是虚函数时,是从这个虚表里取地址去调用的。

C++父类中声明了一个虚函数以后 是不是在子类 以及子类的子类中 都要...
基类声明虚函数只是提供一个接口,也就是实现多态的关键,子类基本都要继承的,如果有一个子类不需要实现这个函数,说明你的继承关系有问题,最好改变一下继承体系

C++父类中有纯虚函数,在子类的子类中也需要实现吗?
(1)在main函数中,假设有父类或者子类的实例对象,就须要有父类的虚函数的实现。(2)在main函数中,假设没有父类或者子类的实例对象,能够不实现父类的虚函数。(3)假设把虚函数写成纯虚函数,也就不须要实现了。也没不会发生上述讨论。子类中实现了,子子类就不用实现。子类没实现的话,子子类...

什么意思?此处去掉virtual会有同样的结果,但把父类的去掉就会不同
这个很简单,父类指针指向子类对象,调用的函数如果是非虚拟成员函数,就直接调用父类的,如果是虚拟的,就调用子类的,这就是虚函数的作用。

C++ 用子类定义的对象 怎么调用父类的成员函数?
不一定,要按继承方式分三种情况讨论。public继承:可以调用基类中被protected和public修饰的成员变量与成员函数。protected继承:可以调用基类中被public修饰的成员变量与成员函数。private继承:不可以调用基类中任何成员变量与成员函数。

c++ 构造函数里可以调用虚函数吗
显然的是:当我们构造一个子类的对象时,先调用基类的构造函数,构造子类中基类部分,子类还没有构造,还没有初始化,如果在基类的构造中调用虚函数,如果可以的话就是调用一个还没有被初始化的对象,那是很危险的,所以C++中是不可以在构造父类对象部分的时候调用子类的虚函数实现。但是不是说你不...

C++中是不是每个类(有虚函数)都对应一个virtual function table?
你理解的是对的,子类和父类各有一个虚函数表,并且虚函数指针也是指向各自的。子类先是从父类复制了一个虚函数表,如果子类对父类的虚函数进行了覆盖,则在子类的虚函数表将会用子类的函数地址覆盖父类的,如果没有覆盖,则还是使用父类的函数地址,这样就实现了多态。

相似回答