c++ - 防止通过派生类调用基类中的静态方法?

标签 c++ inheritance c++17 static-methods

我有一个基类和一个从它继承的派生模板。它们都定义了一个静态方法 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/

相关文章:

java - 继承设计

c++ - 在自己的成员函数中构造类时如何强制类模板参数推导?

c++ - 类模板 : Prevent assignment of <other> type

c++ - 在调试中,如何知道函数重复调用中参数的统计信息(最大-最小值、平均值、分布...)?

c# - 如果自定义 Window 类明确指定内容应该放在哪里,阻止创建自定义 Window 类的背后原因是什么?

javascript - JavaScript 对象的继承

c++ - 如何让 istringstream 更加高效?

c++ - 为什么在函数返回类型中不允许参数推导?

c++ - SDL event.window.windowID 与 GetWindowID()

c++ - 一些未定义的行为是否比其他行为更未定义?