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

时间:2018-08-09 14:45:29

标签: c++ derived-class base-class

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

<acceptor name="stomp">tcp://0.0.0.0:61613?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=STOMP;useEpoll=true;anycastPrefix=/queue/</acceptor>

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

问题:

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

5 个答案:

答案 0 :(得分:3)

这是不可能的。考虑一下nesting dolls之类的类层次结构。派生类是外部类,每个后续基类都是嵌套娃娃。由于基类包含在派生类中,因此您不能将另一个基类用作派生对象的基类。

如果要多个对象共享同一对象,您可以做的一件事是使用std::shared_ptr成员。这样,每个对象可以有一个指向同一对象的指针。

答案 1 :(得分:2)

从问题的描述来看,您似乎想要组合而不是继承。 尤其是,以便您的Write函数是非虚拟的(并且重载非虚拟函数仅在CRTP设计中有意义,而您的类不是CRTP)。

然后,如果您切换到合成,则可以使用(智能)指向拥有对象的指针,并随意替换它。

答案 2 :(得分:0)

每个派生实例都有其自己的任何基类实例,您无法解决这个问题。要使派生类型引用相同的基本实例,需要将其从派生is更改为与成员has的关系-a(然后该成员将必须是引用或指针)。

答案 3 :(得分:0)

这两个类在内存布局上通常不匹配(例如,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并实现一个assignment-operator。这样做:

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

BB b(a)

仅是分配shared_ptr的问题,因此非常便宜。

简短回答您的问题:

  1. 不是当前形式,可能是通过 down 强制转换。但是这个 这可能是一个糟糕的设计。

  2. 是的。可能。

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

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

答案 4 :(得分:-1)

我在该职位上要做的就是这样:

class BB{
public:
    BB(AA& aaObj, const char* other)
    {
        basepointer = &aaobj;
    }

    int Write(double y, int x) {
        basepointer->Write(x);
    }


private:
    AA* basepointer;
};