C++继承模式

C++ inheritance pattern

本文关键字:模式 继承 C++      更新时间:2023-10-16

我想听听你对如何最好地在C++中实现继承模式的看法。说,我有两个基类

class fooBase{
protected:
    barBase* b;
};
class barBase{};

其中CCD_ 1具有CCD_。我打算把这些类放在一个库中,这样无论我在哪里有一个fooBase,它都可以使用它的barBase成员。

我现在打算在一个特定的项目中创建一个专门的这些

class fooSpec : public fooBase{};
class barSpec : public barBase{};

现在我希望fooSpec::b指向barSpec而不是barBase。我知道我可以用new barSpec初始化b,但这需要我在专业化中使用特定函数时将指针投射到fooBase0,不是吗?

有没有其他方法可以实现这一点?

干杯。

在speclass中创建一个方法,将b强制转换为特殊版本。通过这种方式,它看起来不像一个吸气剂,而不是一直铸造它。

另一方面,OO是针对接口而不是对象进行编程。所以你在这里所做的看起来像是面向对象的编程。但很难看出,因为这个例子纯粹是理论性的。

您可以考虑模板解决方案:

template <class T>
class fooBase{
protected:
   T* b;
};

然后将其用作

class fooSpec : public fooBase<barSpec>{};

而通常该碱基将被用作fooBase<barBase>。这是你想要的吗?

通常,我们创建一个具有强制转换并返回指针的函数,并直接使用它而不是成员。

现在我希望fooSpec::b指向barSpec而不是barBase。

没有fooSpec::b这样的东西。b属于fooBase,而您的新类fooSpecfooBase的(专门化)。您无法更改bfooBase成员)的类型为barBase这一事实。这是barBase0的所有实例的一个属性,您不能在您的专业化所涉及的实例的特定子集中使其无效。

我知道我可以用一个新的barSpec初始化b,但这会要求我在任何时候都要将指针投射到barSpec专业化的具体功能,不是吗?

是的,不是。是的,你需要做那个演员;但不,你不需要每次都这么做。您可以封装在fooSpec的函数中。

有没有其他方法可以实现这一点?

我不知道。

这将要求我在想要在专业化中使用特定函数时将指针投射到barSpec,不是吗?

这取决于您试图调用的方法是否在超类中定义,以及它是否是虚拟的。

如果以下情况之一为true,则需要在调用方法之前强制转换指针。。。

  1. 该方法只属于子类
  2. 超类具有该方法的实现,并且子类的实现不会覆盖超类中的实现。这相当于一个函数是否是虚拟函数的问题

避免非叶类中的数据成员,而是使用纯虚拟getter。如果你遵循这个简单的规则,你的问题就会自动解决。

这也使得大多数非叶子类自动抽象,这一开始可能看起来是一种不必要的负担,但你会习惯它,并最终意识到这是一件好事。

和大多数规则一样,这条规则不是绝对的,需要不时打破,但总的来说,这是一条很好的规则。试试看。

如果它看起来过于极端,你可以尝试一种处理双重层次的设计模式,比如"通往天堂的阶梯"。