For some reason the following doesn't crash like my program does, but I'm pretty sure it's similar in design. For one, the output's not correct. It outputs something similar to:
0x537ff4 5471612
While the main program outputs (nil) for the pointer address.
The key to the problem might be display_ in Drv.
Here's the code:
#include <iostream>
#include "debug.h"
class LCDText {
    public:
    int rows_;
    LCDText() { rows_ = 10; };
};
class Generic {
    LCDText *lcdText_;
    public:
    Generic(LCDText *lcdText) { lcdText_ = lcdText; };
    void Setup() {
        Error("%p %d", lcdText_, lcdText_->rows_);
    }
};
class Display : public LCDText {
    Generic *visitor_;
    public:
    Display(Generic *visitor) { visitor_ = visitor; };
};
class Drv : public Generic {
    Display *display_;
    public:
    Drv() : Generic((LCDText *)display_) {
        display_ = new Display((Generic *)this);
    };
    ~Drv() {  delete display_; };
};
int main()
{
    Drv drv;
    drv.Setup();
    return 0;
}