从引用中调用虚函数

时间:2012-06-12 17:29:41

标签: c++ reference

我有这样的结构

struct structure
{
    BaseObject &A; //BaseObject has a function declared as virtual
};

在运行时,我动态地将对象分配给& A

structure *s = new structure;
DerivedObjectB *B = new DerivedObjectB(); //Derived class overloads the virtual function 
s->A = *B; //s is a pointer of the structure. S has been initialized 

我可以编译这段代码但是我在运行时遇到了一个seg-fault错误。 我有一个限制,我不能使用指针。 这不是作业。我用作反向编译器的编译器由于构建SSA的问题而限制使用指针

4 个答案:

答案 0 :(得分:2)

如果无法使用指针,则必须使用引用。 如果您使用引用,则必须将初始化为其构造的最终值

struct structure
{
    BaseObject &A; //BaseObject has a function declared as virtual
    structure(BaseObject &A_) : A(A_) {}
};

DerivedObjectB *B = new DerivedObjectB(); 
structure *s = new structure(*B); //done
//keep in mind you cannot delete `B` until _after_ you delete `s`

上面的代码不应该编译,因为无法以这种方式创建structure,因为它没有自动默认结构,因为它有一个引用成员。此外,即使它已编译,A成员也将是BaseObject的父DerivedObjectB个对象的BaseObject 副本,或者其他一些不喜欢你不想要的东西。

绝对确定你不能在那里使用指针吗?这完全没有意义,并且使这很难使用。

答案 1 :(得分:1)

构建structure后,您无法更改A引用的对象。 你可能想要的是:

struct structure
{
  structure() : A(NULL) {}
  ~structure() { if (this->A) { delete this->A; } }
  BaseObject * A;
};

structure *s = new structure;
s->A = new DerivedObjectB();

无论如何,使用原始指针很容易出错,你应该考虑它。

答案 2 :(得分:0)

我打赌你刚宣布

structure* s;

structure* s = NULL;

amirite? 否则,没有理由发生崩溃。

s->A引用超出范围的对象,因此当您在其上调用operator =时,您会遇到未定义的行为。

这是这两个中的一个。

答案 3 :(得分:0)

这甚至不应该编译。施工后参考不能反弹,你应该收到一个错误,告诉你它一定是绑定的。