c++ - C++ 切片的潜在解决方法?

标签 c++ subclass object-slicing

我有一个 C++ 切片问题。我是 C++ 的新手,所以可能太笨了以至于没有意识到这是不可能的……我尝试了多种解决方法,我目前最好的方法如下所示。 (我需要做这样的事情以避免在非常大的遗留代码库中更改大量接口(interface)。不要声称这是任何方式的优雅风格!!)

编译时遇到问题。这个想法合理吗?还是整个方法注定要失败?引用的构造函数似乎是问题所在。我读过 Stroustrup 的“C++ Programming Lanugage”(或者至少我认为是相关部分),但没有帮助。

class FOO {};

class FOOSUBCLASS : public FOO {
public:
    FOOSUBCLASS(const int id = 0) : _id(id) {}
private:
    int _id;
};

class BAR {
public:
    BAR(const FOO foo) : _foo(foo), _realFoo(&_foo) { }

BAR(const FOOSUBCLASS foosc) : _foosc(foosc), _realFoo(&_foosc) {} 
private:
    FOO _foo;
    FOOSUBCLASS _foosc;
    FOO& _realFoo;
};

编译器不喜欢我的 _realFoo(&_foo) 行。我希望对 _foo 的引用只是类中成员变量的引用。这在 C++ 中是不可能的吗?

这是来自 VS2005 的特定错误:

'initializing' : cannot convert from 'FOO *' to 'FOO &'

最佳答案

_fooFOO& .
&_fooFOO* .
编译器 cannot convert from 'FOO *' to 'FOO &' .
你要的是..., _realFoo(_foo)

无关:您可能真正想要的是 std::unique_ptr<FOO>成员(member)代替。这将小得多,并且更不容易出错。

您现在拥有的结构包含 FOO 的完整实例,以及 FOOSUBCLASS 的完整实例, 和一个引用。 至少把两个FOO union 中的东西,所以大小为BAR只比最大的 FOO 稍大一点衍生物。这可能会使用与 unique_ptr<FOO> 相同的内存.不幸的是,union s 是 C 和 C++ 中错误的常见来源。

另一个问题是如果有人过来写

class FOOSOMETHINGELSE : public FOO {
   int buffer[1024];
};

然后你必须去找BAR类并更改它并使其更大,然后重新编译所有使用 BAR 的代码到处。然而,如果您使用 unique_ptr<FOO> ,那么您就不必更改 BAR或重新编译任何东西。因此出错的机会更小。

关于c++ - C++ 切片的潜在解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12850344/

相关文章:

c++ - 将派生类对象存储在基类变量中

arrays - 如何在 Matlab 中将结构体的叶子作为向量返回?

c++ - 智能指针可以进行​​切片吗?

c++ - 没有歧义的命名空间规范

c++ - 前向申报问题

c++ - ' =' : cannot convert from ' CircularDoubleDirectedList<int>::节点 *' to ' 节点 *'

java - 如何显示组合的算术表达式?就像 (3.3+6.2)*1.2 而不是 9.5 * 1.2

java - 添加功能: subclass vs decorator

python - 如何在子类中调用父类?

c++ - std::tr1 中的 shared_ptr