#include<iostream>
using namespace std;
class A
{
public:
virtual void f(){ cout << "A:f()" <<endl;}
};
class B : public A
{
public:
virtual void f(){ cout << "B:f()" <<endl;}
virtual void g(){ cout << "B:g()" <<endl;}
};
int main()
{
A a;
B * b = (B *)&a;
b->f();
b->g();
return 0;
using namespace std;
class A
{
public:
virtual void f(){ cout << "A:f()" <<endl;}
};
class B : public A
{
public:
virtual void f(){ cout << "B:f()" <<endl;}
virtual void g(){ cout << "B:g()" <<endl;}
};
int main()
{
A a;
B * b = (B *)&a;
b->f();
b->g();
return 0;
}
结果:
A:f()
Segmentation fault (core dumped)
原因,B类型和A类型的虚表指针存储的偏移地址相同。
通过B类指针调用虚函数时,进入到了A类的虚表,因此找到了A类的f()函数调用。但找不到B类的g()函数,实际上是按照B类g()函数的偏移找到了一个错误的函数入口地址,所以调用错误。
这个错误在编译时期无法检查出来。