c++ - 通过具有多重继承的类向上转换 nullptr

标签 c++ multiple-inheritance nullptr

问题在于,在对 nullptr 进行调整时,将 nullptr 隐式转换为具有多重继承结果的类的第二个父类(super class)(至少使用 LLVM 7.0.2)。指针现在不再为空,这(如果在父类(super class)的方法中执行空检查)可能导致崩溃(我猜技术上未定义的行为)。

这是一个最小的例子:

#include <iostream>

inline bool pointerIsNotNull(const void* ptr) { return ptr != nullptr; }

class IntValue {
    public:
        IntValue() { }
        int getIntValue() { return pointerIsNotNull(this) ? value : 0; }
    private:
        int value;
};

static const char* nullptrChar = "nullptr";

class CharValue {
    public:
        CharValue() { }
        const char* getCharValue() { return pointerIsNotNull(this) ? value : nullptrChar; }
    private:
        char* value;
};

class Foo : public IntValue, public CharValue {
    public:
        Foo() { }
        double getDoubleValue() { return pointerIsNotNull(this) ? value : 0; }
    protected:
        double value;
};

int main(int argc, const char * argv[])
{
    Foo* foo = nullptr;

    std::cout << foo->getIntValue() << std::endl;

    CharValue* charValue = foo;
    std::cout << charValue->getCharValue() << std::endl;

    std::cout << foo->getCharValue() << std::endl;
}

我的问题是: 有没有办法在调用第二个父类(super class)之前无需手动检查 nullptr 来检查此类恶作剧?

你知道吗,有没有一种优雅的方法(可能在第二个父类(super class)中)可以确保我已经捕捉到这种行为的所有可能示例?

编辑:是的,我知道从 nullptr 调用成员函数不是现代做法。我认为(直到我发布这个问题)它曾经是公认的做法,无论如何我都受到我无法控制的标准的约束。那么,假设在 nullptr 上调用成员函数将始终输入正确的函数,我的问题是否有优雅的解决方案?

最佳答案

foo->getIntValue()foo 是空指针时未定义,这使得您的整个程序未定义。
也就是说,取消引用本身是未定义的,您的程序在到达检查之前就注定要失败。

检查 this 是否为空是没有意义的,因为编译器可以自由地假设它不是(如果是,程序将是未定义的,所以编译器可以做任何事情它想要)。

关于c++ - 通过具有多重继承的类向上转换 nullptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35049328/

相关文章:

c++ - ‘nullptr’ 之前的预期不合格 ID

c++ - 将 Uint8 转换为 unsigned char RGB 值

c++ - QObject多重继承和operator new

c++ - 精确的信号发生器

Python:多重继承和属性

python - 为什么在父类 __init__() 中调用 super() 会改变子类 __init__() 的行为?

c++ - 如何将 nullptr 作为参数传递?

c++ - nullptr 作为模板参数

c++ - 在 C++ 中迭代具有可变维度大小的 N 维矩阵

c++ - 我如何使用移动语义从类对象中创建共享指针