C++继承模式
C++ inheritance pattern
我想听听你对如何最好地在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
,但这需要我在专业化中使用特定函数时将指针投射到fooBase
0,不是吗?
有没有其他方法可以实现这一点?
干杯。
在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
,而您的新类fooSpec
是fooBase
的(专门化)。您无法更改b
(fooBase
成员)的类型为barBase
这一事实。这是barBase
0的所有实例的一个属性,您不能在您的专业化所涉及的实例的特定子集中使其无效。
我知道我可以用一个新的barSpec初始化b,但这会要求我在任何时候都要将指针投射到barSpec专业化的具体功能,不是吗?
是的,不是。是的,你需要做那个演员;但不,你不需要每次都这么做。您可以封装在fooSpec
的函数中。
有没有其他方法可以实现这一点?
我不知道。
这将要求我在想要在专业化中使用特定函数时将指针投射到barSpec,不是吗?
这取决于您试图调用的方法是否在超类中定义,以及它是否是虚拟的。
如果以下情况之一为true,则需要在调用方法之前强制转换指针。。。
- 该方法只属于子类
- 超类具有该方法的实现,并且子类的实现不会覆盖超类中的实现。这相当于一个函数是否是虚拟函数的问题
避免非叶类中的数据成员,而是使用纯虚拟getter。如果你遵循这个简单的规则,你的问题就会自动解决。
这也使得大多数非叶子类自动抽象,这一开始可能看起来是一种不必要的负担,但你会习惯它,并最终意识到这是一件好事。
和大多数规则一样,这条规则不是绝对的,需要不时打破,但总的来说,这是一条很好的规则。试试看。
如果它看起来过于极端,你可以尝试一种处理双重层次的设计模式,比如"通往天堂的阶梯"。
- 为什么在保护模式下继承升级不起作用
- 具有多个继承共享一个资源的对象 - 寻找良好的设计模式
- 工厂方法模式使用继承而抽象工厂模式使用组合如何
- 在我的情况下,多重继承是一种好的设计模式吗?
- 具有多个继承的工厂模式
- 设计模式:我应该在这里使用继承吗?
- 从虚拟公共模式下的模板类继承的类的原型
- 具有静态属性(服务定位器模式)的模板继承
- 奇怪的重复模板模式 - 继承和朋友
- 在发布模式下禁用从C++中的基类继承
- 装饰设计模式与继承
- 依赖注入/继承设计模式的构造函数参数太多
- 设计模式:继承和封装继承
- 观察者模式和继承:未调用正确的函数
- 奇怪重复的模板模式多态拷贝(C++)中的继承
- 这种编译时确定继承的模式有名字吗
- 带有继承的C++Builder模式
- 不同的类模式:条件构造函数/方法与继承
- C++继承模式
- 具有继承的桥接设计模式,其中抽象基类具有成员数据