c++ - 如何避免在基类中调用函数?

标签 c++

我有两个类 AB,如下所示,B 必须继承自 AB类的classType()函数没有提供,如果调用B::classType(),会得到的类类型>一个。我想在这里得到一个编译器错误,而不是调用 A 类的 classType() 函数。我该怎么做?

一般来说,A的子类应该提供函数classType(),以防作者忘记写classType() 函数,最好报编译错误。这就是目的。也许,我可以在 TypeOf() 函数中使用 static_assert

class A
{
public:
    static const char* classType()
    {
        static const char* s_classType = "A";
        return s_classType;
    }
};

class B : public A
{
};

template <class T>
const char* TypeOf()
{
    return T::classType();
}

int main()
{
    const char* type = TypeOf<B>(); // I would like to get compiler error here, not get "A".
}

最佳答案

或者,在 B 中将 A::classType() 设为私有(private):

class B : public A {
private:
    using A::classType;
}

编辑。问题弄清楚后,我建议您使用类型特征技术而不是静态成员函数。

template<class>
struct Traits;

template<>
struct Traits<A> {
    static const char* classType() {
        return "A";
    }
};

template<class T>
const char* TypeOf() {
    return Traits<T>::classType();
}

现在用户必须为B定义自己的类型特征,否则

const char* type = TypeOf<B>(); 

不会编译。

关于c++ - 如何避免在基类中调用函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53323485/

相关文章:

c++ - 为什么我可以在复制构造函数中访问私有(private)变量?

c++ - 如何获得仅具有模板的 CPP 文件的程序集等效项

c++ - const 参数 "real"是常量吗?

c++ - 如何从stringstream中跳过空格和换行符并将它们放入 vector 中?

c++ - 使用自动变量打印 vector 的内容

c++ - 在以下情况下手动调用析构函数是否是一个糟糕的设计决策?

c++ - 如何修复用作初始值设定项错误的数组?

c++ - 如何读取二进制数据并转换为无符号字符 (C++)

c++ - 基于插入顺序的第一个最重复的单词

c++ - 如何在没有第三方软件的情况下轮询鼠标宏键?