std :: function和继承可以共存吗?

时间:2019-03-14 13:19:29

标签: c++ c++17

我有一个抽象类文件

struct Abstract {
    virtual bool preflightCheck(void) = 0;
    std::function<void(Abstract *)> didIssueError;
    virtual ~Abstract() {}
}

一个带有派生类的文件

class Derived : public Abstract {
    bool preflightCheck(void) {
        if(didIssueError != nullptr)
            this->didIssueError(reinterpret_cast<MediaAssetAbstract*>(this));
    }
}

然后我有一个名为didIssueError的文件,称为lambda

bool testDerived(Abstract & derived) {
    derived.preflightCheck();
    derived.didIssueError = [&derived](Abstract * derived) {
        std::cout << "error" << std::endl;
    };
    return true;
}

int main() {
    auto derived = Derived();
    assert(testDerived(derived));
    return 0;
}    

如果我取消选中nullptr上的支票,程序将崩溃并显示以下消息  terminate called after throwing an instance of 'std::bad_function_call' what(): bad_function_call

请问哪里有问题?从派生类到didIssueError不兼容吗?

1 个答案:

答案 0 :(得分:4)

  

std::function和继承可以共存吗?

好的。

  

如果我取消选中nullptr上的支票,程序将崩溃并显示以下消息    terminate called after throwing an instance of 'std::bad_function_call' what(): bad_function_call

     

请问哪里有问题?

问题是您在向didIssueError分配功能之前先调用了它:

// call:
derived.preflightCheck();

// assignment:
derived.didIssueError = [&derived](Abstract * derived) {
    std::cout << "error" << std::endl;
};

C ++是一种过程语言,而不是数据流语言。


P.S。这个:

this->didIssueError(reinterpret_cast<MediaAssetAbstract*>(this));

错了。