从虚拟函数调用派生类的成员
Calling member of Derived class from virtual function
我对虚拟函数有点困惑。
让我们假设您有一个带有虚拟函数foo()的基类,然后该函数在派生类中被重写
class Baseclass
{
public:
virtual void foo()
{
//...
}
};
class Derived: public BaseClass
{
private:
int member_val;
public:
Derived( int init )
: member_val( init )
{}
void foo()
{
member_val++;
}
};
和使用派生类的成员值的foo,当我编写此代码时
Derived d( 10 );
Base* bPtr = &d;
bPtr->foo();
foo()调用了Derived类,因为_vptr指向"Derived class virtual table",而"Deriveed class virtual table"中的指针指向Derived类中的foo(。我们把它称为Base*(这是Base类型),但要找到member_val,我们需要Derived*(这个Derived类型)。那么它是如何在引擎盖下工作的呢?
正确的问题是一半的答案。就像在您的案例中一样,您询问this
传递给Derived::foo()
的是什么,答案是"相同"。您创建了一个类为Derived
的对象。它在内存中的分配方式如下:
Derived:
--------
vptr_t* vptr
int member_val
然后将&d
强制转换为Derived*
到Base*
。指针怎么了?没有什么它只是改变了它的类型,而不是它所指向的实际地址。然后可以使用dynamic_cast<Derived*>()
甚至static_cast<Derived*>
将它转换回Derived*
。在这种情况下,两者都使用是绝对安全的。
因此,唯一实际的问题是虚拟函数表是如何工作的?但这是另一个问题,你似乎明白了
请注意:当几个基类一个接一个地位于内存中时,多重继承会使事情变得更加复杂。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何使用基类指针引用派生类成员
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 在 C++ 中用派生类型重写成员函数
- 如果基类包含双指针成员,则派生类的构造函数
- 在派生类中绑定非静态模板化成员函数
- 为什么派生类的好友不能使用受保护的成员?
- 在派生类中使用基类的私有成员变量的最佳方法
- 派生类如何获取基的成员?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 调用派生类成员函数
- 从模板化父类中的派生内部类访问受保护的成员变量
- 将基类的成员函数重载到其他派生类C++
- 派生的成员 通过指向基、static_cast、crtp、删除模板的指针
- C++ 使用派生类方法更改基类数据成员
- 派生类看不到基类成员
- 使用派生类中的静态成员而不是基类
- 是否可以使用 using 将基类中的公共成员重新声明为派生类中的私有成员?
- 如何将派生类中的成员函数作为回调传递?