首页 > 解决方案 > C ++静态继承中的取消引用指针问题?

问题描述

我正在尝试使用静态多态性,但我收到编译时警告和分段错误错误。出了什么问题?

编译器:arm-linux-g++ (GCC) 4.4.2

警告:取消引用指针“this.123”确实违反了严格别名规则,警告:取消引用指针“this.124”确实违反了严格别名规则

#include <unistd.h>
#include "extlib.h" ///void ledFunc(uint32_t state);

template<typename T>
class BaseLed {
public:
    explicit BaseLed(){}
    virtual ~BaseLed() {}

    void turnOn(){static_cast<T*>(this)->trunOn();}
    void turnOff(){static_cast<T*>(this)->trunOff();}
};

class Led: public BaseLed<Led>{
public:
    typedef void (*LedFuncPtr)(uint32_t);

    Led():
        BaseLed<Led>(), mLedSetPtr{ledFunc}
    {}
    virtual ~Led(){}

    void trunOn(){ mLedFuncPtr(1); }
    void trunOff(){ mLedFuncPtr(0); }

private:
    LedFuncPtr mLedFuncPtr;

};

int main() {
    BaseLed<Led> led;
    led.turnOn();
    sleep(2);
    led.turnOn();
    return 0;
}

标签: c++

解决方案


led不是a Led,是a BaseLed<Led>

turnOnand中,如果确实是 type 的对象,turnOff则只能取消引用强制转换的指针,而事实并非如此。 因为它不是,所以行为是未定义的。*thisT

这是相同的情况,但没有模板:

struct A
{
    void foo();
};

struct B: A
{
    void bar() {}
};

void A::foo()
{
    static_cast<B*>(this)->bar();
}

int main()
{
    A a;
    a.foo();
}

您需要一个正确类型的对象:

int main() {
    Led led;
    led.turnOn();
    sleep(2);
    led.turnOn();
    return 0;
}

推荐阅读