[英]C++ replace base class in derived class
我相信我正在考虑这个“非常糟糕”(非C ++')。 这就是我想要做的
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的基础对象。 我不想要副本,我希望实际的基础对象是相同的(相同的参考)。
问题:
这是不可能的。 想想像嵌套娃娃这样的类层次结构。 派生类是外部的类,每个连续的基类是嵌套的玩偶。 由于基类包含在派生类中,因此不能将另一个基类用作派生对象的基类。
如果您希望多个对象共享同一个对象,您可以做的一件事是使用std::shared_ptr
成员。 这样每个对象都可以有一个指向同一对象的指针。
从问题的描述,看起来你想要组成而不是继承。 特别是你的Write
函数是非虚拟的(并且重载非虚函数只在CRTP设计中有意义,而你的类不是CRTP)。
比如果你切换到合成,你可以使用(智能)指针来拥有对象,并随意替换它。
每个派生实例都有自己的任何基类实例,你无法解决这个问题。 要使派生类型引用具有相同的基本实例,需要将其从派生的is-a关系更改为成员has-a(然后该成员需要是引用或指针)。
这两个类在内存布局中通常不会相互匹配(例如,您可能在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
并实现赋值运算符 。 这样做:
AA a;
/* ... */
BB b;
b = a;
要么
BB b(a)
变得只是分配shared_ptr
的问题,因此非常便宜。
简而言之,回答你的问题:
不是现在的形式,可能是通过向下铸造的方式。 但这可能是一个糟糕的设计。
是。 大概。
AA
的引用,将AA
复制到BB
(这可能不是一个很大的成本),重构,以便你可以直接实例化BB
,而不是向上发送给AA
到你的初始化程序。 为了提供更详细的建议,我们需要更多有关您尝试优化的特定问题的代码或信息。
我在那个位置会做的事情是这样的:
class BB{
public:
BB(AA& aaObj, const char* other)
{
basepointer = &aaobj;
}
int Write(double y, int x) {
basepointer->Write(x);
}
private:
AA* basepointer;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.