让我们假设我们有以下代码。
class b
{
public:
virtual foo();
};
class c : public b
{
public:
void foo();
};
int main()
{
C c;
B* b = &c;
b->foo(); //I understand that it call foo() in class C
}
我想了解的是在vtable的帮助下?
我理解以下内容
1)b将有一个vtable,其指针指向函数foo()。
2)当编译器遇到类c时,b的vtable将在C中继承。
我的问题
1)b的继承vtable是否会更新c :: foo()的地址?我有这个疑问,因为c :: foo()不是虚函数。主要是我读到的内容指向具有虚拟功能的vtable。
答案 0 :(得分:0)
foo()的'virtual'是继承的。
为每个foo()添加唯一的cout以确认:
class B
{
public:
virtual ~B() {}
virtual void foo() { std::cout << "b::foo()" << std::endl; };
};
class C : public B
{
public:
virtual ~C() {}
virtual void foo() { std::cout << "c::foo()" << std::endl; };
};
int t205(void)
{
C c;
c.foo();
B* b = &c;
b->foo();
b->B::foo(); // b::foo is still accessible
return(0);
}
输出:
c::foo()
c::foo()
b::foo()