Я боролся за какой-то код, где я не знаю, как назвать его и как его решить. Я попытался свести код к следующему примеру (поэтому сам пример не имеет смысла, но он показывает проблему):
struct MyInterface {
virtual ~MyInterface() {
};
virtual void Output() = 0;
};
class A {
public:
MyInterface *myInterface;
A(MyInterface *myInterface) {
std::cout << "this in A constructor: " << this << std::endl;
this->myInterface = myInterface;
}
void CallA() {
this->myInterface->Output();
}
};
class B : public MyInterface, A {
public:
int v;
B(int v) : A(this) {
std::cout << "this in B constructor: " << this << std::endl;
this->v = v;
}
virtual void Output() override {
std::cout << "Whatever" << std::endl;
}
void CallB() {
std::cout << "this in CallB: " << this << std::endl;
this->CallA();
}
};
class Foo {
public:
B b;
Foo() : b(42) {
b = B(41); //This will make an "invalid" B:
//generates B on the Stack but assign the bytes to Foo.b (which is on the the heap)
//so b.myInterface will point to the stack
//after leaving this context b.other will be invalid
}
void Exec() {
b.CallB();
}
};
int main(int argc, char **args) {
Foo *foo = new Foo();
foo->Exec(); //Gives a segfault, because foo->b.myInterface is not valid
return 0;
}
Сначала я подумал, что это как-то связано с наследованием и его виртуальными методами. Но я думаю, что основной проблемой является указатель this
внутри конструкторов.
Итак, мои вопросы: когда строится b, указатель this
в конструкторах указывает на стек. Почему не отображается указатель this
на целевую память (в куче)? Конструктор копирования не называется - Почему?
Как я могу назвать эту проблему?