我相信我正在考虑这种“严重”问题(非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的基础对象。我不想复制,我希望实际的基础对象是相同的(相同的引用)。
问题:
答案 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
的问题,因此非常便宜。
简短回答您的问题:
不是当前形式,可能是通过 down 强制转换。但是这个 这可能是一个糟糕的设计。
是的。可能。
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;
};