【发布时间】:2018-04-30 02:51:45
【问题描述】:
在以下代码中:
#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;
}
如果我更改 TextViews 继承顺序,我将在 itv->setText(); 调用时出现段错误。
为什么重要?我可以在这里使用static_cast,还是在这里使用UB?据我了解dynamic_cast 仅需要虚拟继承,据我所知,这种情况并非如此。
【问题讨论】:
-
试试
ITextView* itv = &tv; void* ptr = itv;
标签: c++ inheritance casting multiple-inheritance