C++:构造函数在继承链中的放置位置
C++: where to place constructor in inheritance chain?
我有以下困境:
我有一个完整的抽象类。每个继承类将需要 3 个相同的参数。它们中的每一个都需要其他特定参数。
我可以:
1) 实现一个公共构造函数,用于在我的基类中初始化 3 个公共参数,但随后我必须为相应的字段制作非抽象的 getter(它们是私有的)。
或
2)让我的基类抽象并在继承的类中实现构造函数,但是我必须在每个类字段中为公共参数制作它。
哪种方法更好?我不想使用受保护的成员。
抽象类是至少有一个纯虚拟(或者,正如你所说的抽象)函数的类。拥有非抽象、非虚函数不会改变你的类是抽象的事实,只要它至少有一个纯虚函数。在基类中拥有通用功能,即使它是抽象的。
避免代码重复而又不污染数据成员的抽象接口的一种方法是引入额外的继承级别:
// Only pure virtual functions here
class Interface {
public:
virtual void foo() = 0;
};
// Things shared between implementations
class AbstractBase : public Interface {
};
class ImplementationA : public AbstractBase {
};
class ImplementationB : public AbstractBase {
};
如果你的类看起来像这样,一个纯抽象类:
class IFoo {
public:
virtual void doThings() = 0;
}
class Foo {
public:
Foo(std::string str);
void doThings() override;
}
您的继承的价值是为您提供在运行时用另一个替换 Foo 的机会,但将具体的实现隐藏在接口后面。你不能用构造函数来利用这个优势,没有虚拟构造函数这样的东西(这就是为什么存在抽象工厂模式这样的东西)。Foo
的所有实现都采用std::string
,而doThings
的所有实现都使用该字符串?太好了,但这是巧合,不是合同,不属于IFoo
.
让我们谈谈您是否在 IFoo
中创建了具体的实现,以便它是一个抽象类而不是一个纯粹的抽象类(顺便说一句,IFoo
现在会是一个坏名字)。(*1)让我们假设使用继承来共享行为是你的类的正确选择,这有时是正确的。如果类具有需要初始化的字段,则创建一个protected
构造函数(从每个子实现调用)并删除/省略默认构造函数。
class BaseFoo {
private:
std::string _fooo;
protected:
BaseFoo(std::string fooo) : _fooo(fooo) {}
public:
virtual void doThings() = 0;
std::string whatsTheBaseString() { return _fooo;}
}
以上是从子构造函数正确传递基类所需字段的方式。这是一个编译时保证,子类将"记住"正确初始化_fooo
,并避免将实际成员fooo
暴露给子类。尝试直接初始化所有子构造函数中的_fooo
在这里是不正确的。
*1)很快,为什么?构图在这里可能是一个更好的工具?.
- 如何在整数中找到最低有效位(LSB)的位置?c ++
- 如何在接触时重置我的角色位置?
- C++ - 重置字符串流不会重置获取位置或清除标志吗?
- с++:使用位位置的快速操作
- MATLAB API用于使用MatgetDir的C例外:Matrix :: Serialize ::在内存位置内置
- 有没有办法汇总数组的位位置
- 如何将X重置回阵列中的原始位置
- 如何获取设置位中的相对位置
- 获取设置故障位的流位置 / std::ios::抛出故障
- SDL2切换全屏:窗口位置重置
- SFML 碰撞检测,C++ -> 重置玩家位置
- 最佳的c++方式来随机选择设置位在位集中的位置
- 最快的函数将位置设置为一个无符号整数中两个位之间的位
- 二进制快速排序起始位位置
- 如何在无符号 N 位交互器中修复二进制点的位置
- 如何读取和重置字符位
- 垂直按位 COUNT(同一位置上的 1 之和)
- 将数据复制到指定的位位置
- 自动生成位位置
- 获取64位整数中位位置的数组