我真的不知道如何简单地给这个问题起个标题。
:
- 在c++中
- 有一个
Base
作为接口,它指定了我们拥有的所有特性(成员函数)。也有多个派生类可以实现功能的子集。这些函数是虚函数。 - 还有一些函数在所有派生类中都是相同的。
- 允许重载成员函数
- 我们可以通过使用SFINAE或概念来静态检查某个函数在某些
Derived
中是否可用。
要求:
- 当使用派生函数调用非实现函数时,应该有一些编译警告或错误。
- 由于功能和派生的数量可以增加,我希望当这样的事情发生时我不需要改变(或添加)太多。
- 派生类也应该能够转换为基类。
- 不需要为那些"相同的功能"做太多。2.
可能的解决方案(不完美):
-
实现
Base
中的每个功能并抛出错误。在Derived
中使用using
,并将函数放在private字段中。缺点:如果有一个新特性,我们需要把它添加到每个类中。如果我们忘记这样做,没有警告。 -
在
Base
中使用纯虚函数,并在每个Derived
中为每个特性实现它们。缺点:Derived
不需要的功能有很多实现(和代码),而且实现都是一样的——抛出错误。 更新:
为11。:通过"很多实现",我做了一个例子:https://godbolt.org/z/sW8eKjbhx.
可以将此函数标记为纯虚函数。然后必须在派生类中重写它。但它仍然可以有主体
class Base {
public:
virtual void f() = 0;
};
void Base::f() {
// ...
}