这个问题是关于用不同的返回类型覆盖派生类中的虚拟方法。对于以下代码:
class father {
public:
virtual father* ref() { return this; }
};
class child : public father {
virtual child* ref() { return this; }
};
当我尝试直接获取指针时,g++ (F15, g++4.5) 报告“从父亲到孩子的无效转换”
child m_child;
father* pf = &m_child;
child* pc = pf->ref();
我了解使用了子类中的 ref() 方法,这可能只是编译时类型不匹配。
但是,有没有办法在不显式使用类型转换的情况下做到这一点?
额外说明:我理解编译器报这个错误的原因。我需要的是开箱即用的东西,它可以访问派生对象中的数据,而无需显式转换指针。
父类用于将不同的派生子对象放入列表或向量中,因此当从列表或向量中获取项目时,无法分辨它属于哪个子类。
我有内部方法来记录和检查子类类型。但我不想显式转换指针。
例如,我想做这样的事情:
// assuming pf is pointer pointed to an item fetch from a vector
switch(fp->get_type()) {
case child_type1: fp->ref()->list1.push(data); break;
case child_type2: fp->ref()->list2.push(data); break;
case child_type3: fp->ref()->list3.push(data); break;
}
现在,我需要在每种情况下以及每次需要访问派生类中的数据时显式声明一个新变量或显式将 fp 转换为正确的类型,这既乏味又令人困惑。
我期望的是:可能是一些 boost 库可以以我还不知道的另一种方式做类似的事情,或者可能是 c++11 标准允许它但需要设置一个特殊的编译参数?