我有一个基类和一个从它继承的派生模板。它们都定义了一个静态方法 calculateSize()
但具有不同的方法签名。 (两者都被实例化为对象;Base 不仅仅是一个接口(interface)。)
class Base{
public:
static size_t calculateSize(size_t payload);
};
template<typename T>
class Derived : public Base{
public:
// sloppy fixo to prevent Base::calc() from being called
static size_t calculateSize(size_t){ assert(0); return calculateSize(); }
// correct method to call
static size_t calculateSize();
};
如果调用派生类型,此方法的基类版本将给出错误答案,因此我想防止通过 Derived::calculateSize(sz)
意外调用它。这通常是如何实现的? (我目前在 Derived
中有一个具有相同签名的方法,如果调用则断言,但这感觉有点黑客......)
最佳答案
如果派生类中有一个 calculateSize
,它将隐藏基类中的 calculateSize
,因此您可以不包含任何内容:
template<typename T>
class Derived : public Base {
public:
static size_t calculateSize();
};
// Error: no function that takes an argument
size_t result = Derived<int>::calculateSize(1);
如果您没有东西可以隐藏它,或者您希望更清楚地表明您不应该使用基类签名调用它,您可以=删除
它:
template<typename T>
class Derived : public Base {
public:
// Explanatory comment here
static size_t calculateSize(size_t) = delete;
static size_t calculateSize();
};
// Error: trying to use deleted function
size_t result = Derived<int>::calculateSize(1);
关于c++ - 防止通过派生类调用基类中的静态方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75241121/