ををstatic_cast:私はTextView
の継承の順序を変更した場合、私はitv->setText();
呼び出しでセグメンテーション違反があるでしょうC++複数のインタフェースを継承し、次のコードでは
#include <iostream>
#include <thread>
#include <mutex>
#include <functional>
struct IView {
virtual void setOnClick() = 0;
};
struct ITextView : IView {
virtual void setText() = 0;
};
struct IButton : ITextView {
virtual void setRadius() = 0;
};
struct View : IView {
int i = 1;
virtual void setOnClick() override {
std::cout << "setting OnClick! i: " << i << std::endl;
};
};
/// Works as is
/// But if make "TextView : View, ITextView" - have segfault on the run
struct TextView : ITextView, View {
int j = 2;
virtual void setText() override {
std::cout << "setting text! i: " << i << " j: " << j << std::endl;
};
// forward IView
virtual void setOnClick() override {
View::setOnClick();
}
};
int main() {
TextView tv;
void* ptr = &tv; // I need to pass raw pointer, and then restore "interface" from it
ITextView* itv = static_cast<ITextView*>(ptr); // I don't need safety checks here
itv->setOnClick();
itv->setText();
return 0;
}
。
なぜ重要ですか?ここでstatic_cast
を使用できますか、またはここにUBがありますか?私が理解しているように、仮想継承でのみ必要なのはdynamic_cast
で、これは私が言うことができるように、その場合ではありません。
試す 'ITextView * itv = &tv; void * ptr = itv;' –