构造函数调用虚拟子函数c ++

时间:2015-02-18 10:49:45

标签: c++ inheritance constructor virtual-functions

抱歉打扰你这么容易的'题。我试图对我的代码进行概述,所以我希望以下内容干净整洁,这是我的精简代码:

class field_t {
public:
    field_t(fieldmap_t* fieldmap);
    ~field_t();
private:
    fieldmap* fieldmap;
    virtual int add_self_to_set(){  std::cout << "ERROR"; std::exit(0);   };
};

//constructor
field_t::field_t(fieldmap * fieldmap){
    this->fieldmap=fieldmap;
    this->add_self_to_list();
};



class area_t : public field_t {
public:
    // constructors are not inherited
    area_t(fieldmap_t* fieldmap) : field_t(fieldmap);
private:
    virtual int add_self_to_set(); //virtual because their will be further child classes.
};

int area_t::add_self_to_set() {
    this->fieldmap->area_list.insert(this);
    return 1;
};

好的,这段代码应该有效(希望我错过了;或者不是这样)。 问题是什么?作为area_t calls field_t::field_t(fieldmap)的构造函数,它(当然)构建了一个field_t object,它会说“错误”。和exit();。

我想要的是在构造函数中调用替换的area_t::add_self_to_set()函数(这就是我在field_t中将其声明为虚拟的原因),但这并不起作用。这似乎是我的逻辑,但我不知道如何正确实施它。我需要将类插入到每个类类型的另一个列表(std::set)中。

当我注意到这些问题时,我也想到了另一种方式。我可以通过直接调用

add_self_to_list()调用添加到area_t构造函数中
area_t(fieldmap_t* fieldmap) : field_t(fieldmap){this->fieldmap->area_list.insert(this);};

并省略所有虚拟add_self_to列表内容。但这会导致下一个孩子的下一个问题:

class entrance_t : public area_t{
    entrance_t(fieldmap_t* fieldmap) : area_t(fieldmap){this->fieldmap->entrance_list.insert(this);};
};

我当然不希望entrance_t出现在are_list中! 构造函数的类似问题。

任何想法?非常感谢你提前的时间。我想我不需要说,我是初学者^^。

迎接

0 个答案:

没有答案