C ++替换派生类中的基类

Dweeberly

我相信我正在考虑这种“严重”问题(非C ++'y)。这就是我想要做的

class AA {
    public:
        AA(const char* name, unsigned short number);

        int Write(int x);
    ...
    }

class BB: public AA {
    public:
        BB(const char* name, unsigned short number, const char* other);
        BB(AA aaObj, const char* other);

        int Write(double y, int x) {
            /* do something */
            AA::Write(x)
            }
    ...
    }

在第二个BB构造函数中,我想用aaObj替换BB的基础对象。我不想复制,我希望实际的基础对象是相同的(相同的引用)。

问题:

  1. 这可能吗?
  2. 这是一个坏主意吗?
  3. 是否有更好的模式(工厂生产具有共享成员的对象?
高特

这两个类通常在内存布局上匹配(例如,您可能在中有其他数据成员BB)。此外,由于您在构造函数中,因此您已经在创建一个新对象。

BB除非您确定AA原来是的一个BB类(或的子类BB否则您不能向下转换例如:

BB b;
AA * a = dynamic_cast<AA *> (&b);
/* use initialization code for AA on a */
/* Now you could do (though this example becomes a bit weird): */
BB *bb = dynamic_cast<BB *> (a);

为什么要避免复印?您有大量的数据成员吗?在这种情况下,请考虑shared_ptr在相关的类成员上使用a并实现一个赋值运算符这样做:

AA a;
/* ... */
BB b;
b = a;

要么

BB b(a)

只是分配shared_ptrs的问题,因此非常便宜。

简短回答您的问题:

  1. 不是当前形式,可能是向下浇铸。但这可能是一个错误的设计。

  2. 是。大概。

  3. 如果您有很多成员,例如字符串等,请考虑:保留对的引用AA,复制AABB(这可能不是很大的代价),进行重构,以便可以BB直接实例化,而将向上转换发送AA到初始化例程。

为了提供更详细的建议,我们需要有关您要优化的特定问题的更多代码或信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章