0

假设我有三个类,一个抽象类,一个派生类和一个包含派生类的类。

class Parent {
public:
  Parent();
  void FunctionOne() { cout << "error"; }
  void FunctionTwo() = 0;
}

class Child : public Parent {
public:
  Child();
  void FunctionOne() { cout << "implement function one" ;}
  void FunctionTwo() { cout << "implement function two" ;}
}


class Execute{
public:
  Execute(Parent& newparent) : parent(newparent) ;
  Execute& operator=(const Execute& in) {
          parent = in.parent;
  Run() { parent.functionOne(); parent.functionTwo(); }

private:
  Parent& parent;
}

当我创建我的对象 Execute 一切都很好。

Excecute execute( Child );
execute.run();

输出:“实现功能一”“实现功能二”

问题是当我将它添加到向量时,正在复制 Execute,即复制父级,但不是将子级复制到父级并使用多态性,而是父级正在复制一个抽象类,我的输出是“错误”并且我的程序崩溃.

vector<Execute> list;
list.push_back( Execute( Child ) );
list[0].run();  // ERROR

是否可以复制引用以便复制 Child 类?我需要切换到指针吗?问题是,由于正在复制 Execute,我没有一种简单的方法来管理删除指向 Child 的指针。我不能在这台机器上使用 Boost 或 shared_ptr<>。

我在我的帖子中添加了继承,很抱歉遗漏了它。我想我用 Execcute execute( Child ); 解决了这个问题。抱歉,我试图简化问题以使其易于理解,并且可能引入了一些细微的错误。你能帮我解决我原来的问题吗?

4

2 回答 2

0

首先,您要在类中存储对临时对象的引用。一旦您超出当前范围,您对该实例执行的任何Execute操作都将在无效引用上运行。

要解决这个问题:

class Execute
{
public:
    Execute(Parent* newparent) : parent(newparent) {}
    Execute(const Execute& e) : parent(e.parent) {} // for the rule of 3

    ~Execute() {} // empty destructor - since you didn't create it, you shouldn't delete it

    Execute& operator=(const Execute& in) 
    {
        parent = in.parent;
        return *this;
    }

    Run() 
    {
        parent.functionOne(); 
        parent.functionTwo(); 
    }

private:
  Parent* parent;
};

然后,当你使用它时:

Parent* p = new Child();
// to show the scoping doesn't destroy p
{
    Execute e(p);
    e.Run();
}
delete p;

您可以在任何容器中传递Execute实例,它不会使parent另一个实例的有效成员无效。但是当你完成它们时,你必须自己清理它们。

于 2013-09-24T17:36:42.493 回答
0

如果所有错误都已修复并且函数被声明为虚拟并且可以编译代码,则行为符合预期:

implement function oneimplement function two

正如您提到的, parent 是对某些“原始”对象的引用。该对象必须是动态分配的、全局的或自动的,但比 Execute/vector 的寿命更长。或者您可以将父级更改为普通成员变量,而不是引用。

Child c;
vector<Execute> list;
list.push_back( Execute( c ) );
list[0].Run();
于 2013-09-24T17:41:09.470 回答