我定义了一个派生类的成员变量作为对基类成员变量的引用。我这样做是因为在派生类中,引用的名称比基类中原始变量的名称更有意义。
现在我正在创建一个 char 缓冲区,其大小足以包含派生类的一个对象。我定义了一个指向派生类的指针,并使用 static_cast
将其指向缓冲区。
如果派生类的成员函数使用其在基类中定义的原始名称取消引用基类成员 var,则没有问题。
但是如果使用引用的名称取消引用,我会遇到内存访问冲突。
- 为什么会有不同的行为?
我怎样才能实现我正在尝试做的事情,即在派生类中用不同的名称引用变量?
class B { public: int x; B () : x(10) {} }; class D : public B { public: int &y{ x }; // No problem here: inline bool IsXTen () { return ((x == 10) ? true : false); } // Memory Access Violation occurs here: inline bool IsYTen () { return ((y == 10) ? true : false); } }; int main(int argc, char* argv[]) { char buf[sizeof (class D)] = { 0 }; void *pVoid = buf; class D *pd = static_cast<class D*>(pVoid); if (pd->IsXTen ()) { return 1; } if (pd->IsYTen ()) { return 2; } return 0; }
最佳答案
引用很可能作为指针存储在对象的内存布局中(参见 Why do references occupy memory when member of a class? )。您没有调用初始化该引用/指针的构造函数,因此使用它是未定义的。
关于c++ - 引用基类的成员 var 导致访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49842779/