1.假设C的地址为0x100,根据以下程序求 A的地址 和 B的地址?
class A
{
public:
virtual void func1(){
}
};
class B
{
public:
virtual void func2()
{
}
};
class C:public A, public B
{
public:
virtual void func3()
{
}
};
int main()
{
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
C *c = new C();
printf("%p\n", c);
A *a = static_cast<A*>(c);
printf("%p\n", a);
B *b = static_cast<B*>(c);
printf("%p\n", b);
return 0;
}
- 解答
A的地址和C相同,为 0x100,B的地址由于占用了一个虚函数表指针(64位系统中为8字节),所以B的 地址为 0x108
2.如下程序中b能否调用A中的func()?
class A
{
public:
virtual void func(){
cout << "A::func()" << endl;
}
void func1(){
cout << "A::func1()" << endl;
}
};
class B:public A
{
public:
void func(){
cout << "B::func()" << endl;
}
};
int main()
{
B *b = new B();
return 0;
}
- 解答
可以,虚函数 重写是在运行时才进行的,而b可以只使用静态联编,不使用动态联编的虚函数重写,这样直接通过域限定符就可以调用A中的func()。
b->A::func();