c++ - 引用基类的成员 var 导致访问冲突

标签 c++ reference derived-class

我定义了一个派生类的成员变量作为对基类成员变量的引用。我这样做是因为在派生类中,引用的名称比基类中原始变量的名称更有意义。

现在我正在创建一个 char 缓冲区,其大小足以包含派生类的一个对象。我定义了一个指向派生类的指针,并使用 static_cast 将其指向缓冲区。

如果派生类的成员函数使用其在基类中定义的原始名称取消引用基类成员 var,则没有问题。

但是如果使用引用的名称取消引用,我会遇到内存访问冲突。

  1. 为什么会有不同的行为?
  2. 我怎样才能实现我正在尝试做的事情,即在派生类中用不同的名称引用变量?

    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/

相关文章:

c++ - 派生类析构函数如何在以下程序中被调用为私有(private)的?

c++ - Base dtor 应该有一个定义吗?

php - 错误消息 “Strict standards: Only variables should be passed by reference”

html - 具有 set Input() 任意类型的可重用组件是一个好的实践吗?

c++ - &符号(&)符号如何在c++中工作?

C++ 我可以根据给单个构造函数的参数创建派生类而不是 bass 类吗?

c++ - 使用抽象类实现派生类的元素栈

c++ - while 循环不会以不止一个异常结束

c++ - 有没有办法从 file.obj 查看源代码?

c++ - 我可以在运行时初始化 static float 变量吗?