基类Base里面有两个虚函数A和B,子类Drive继承至Base,重写了其中一个接口有重写另一个接口。使用者获取到到的是指向子类B的基类指针。使用者如何知道子类重写的是接口A还是接口B,cpp有机制实现饿么
时间: 2023-02-20 21:46:31 浏览: 82
有一种方法可以实现,就是使用虚函数表。虚函数表是由编译器自动生成的,存放在每个类的虚函数指针的内存空间中。每个类的虚函数表都会记录虚函数的地址,如果子类重写了父类的虚函数,虚函数表中就会记录子类重写的虚函数地址。使用者可以通过虚函数表来判断子类是否重写了父类的虚函数,从而知道子类重写的是接口A还是接口B。
相关问题
基类Base里面有两个虚函数A和B,子类Drive继承至Base,重写了其中一个接口,没有重写另一个接口。使用者或者到的是指向子类B的基类指针。使用者如何知道子类重写的是哪个指针,cpp有机制实现饿么
C++提供了一个名为“虚函数表”的技术,它可以帮助您跟踪子类是否重写了基类中的虚函数。当使用者将指向子类的基类指针传递给虚函数时,编译器会检查虚函数表,以确定调用哪个虚函数。如果子类重写了某个虚函数,编译器将调用子类的虚函数,而不是基类的虚函数。
基类Base里面有两个虚函数A和B,子类Drive继承至Base,只重写了其中一个接口,没有重写另一个接口。使用者获取到到的是指向子类B的基类指针。使用者如何知道子类重写的是接口A还是接口B,cpp有机制实现么,如果能实现写一个demo
C++可以使用虚函数表来实现,具体实现可以参考以下demo:
#include <iostream>
using namespace std;
class Base {
public:
virtual void funcA() { cout << "Base funcA" << endl; }
virtual void funcB() { cout << "Base funcB" << endl; }
};
class Drive : public Base {
public:
virtual void funcA() { cout << "Drive funcA" << endl; }
//virtual void funcB() { cout << "Drive funcB" << endl; }
};
int main()
{
Base *p = new Drive();
p->funcA();
p->funcB();
return 0;
}
输出结果:
Drive funcA
Base funcB
阅读全文