繁体   English   中英

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

[英]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的基础对象。 我不想要副本,我希望实际的基础对象是相同的(相同的参考)。

问题:

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

这是不可能的。 想想像嵌套娃娃这样的类层次结构。 派生类是外部的类,每个连续的基类是嵌套的玩偶。 由于基类包含在派生类中,因此不能将另一个基类用作派生对象的基类。

如果您希望多个对象共享同一个对象,您可以做的一件事是使用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的问题,因此非常便宜。

简而言之,回答你的问题:

  1. 不是现在的形式,可能是通过向下铸造的方式。 但这可能是一个糟糕的设计。

  2. 是。 大概。

  3. 如果你有很多成员像字符串等,考虑:保持对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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM