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

时间:2018-11-15 16:08:38

标签: c++

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

通常,classType()的子类应提供函数A,以防作者忘记编写A函数,最好报告编译器错误。这就是目的。也许我可以在classType()函数中使用classType()

static_assert

4 个答案:

答案 0 :(得分:4)

或者,在fmt.setBackground(QColor(Qt::yellow))中将A::classType()设为私有:

B

编辑。问题明确之后,建议您使用类型特征技术代替静态成员函数。

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

无法编译。

答案 1 :(得分:3)

除了代码中的几个拼写错误外,还为类$.getJSON(setUrl(pagination, page), function (response) { var old = []; old = JSON.parse(localStorage.getItem('msg')); old.push(response.DATA); console.log(old); }); 的定义添加了以下内容

B

Live Demo

答案 2 :(得分:1)

我从@Evg得到了这个主意,谢谢Evg。 使用如下模板:

class A
{
public:
    template <class T>
    static const char* classType() { static_assert(false, "classType not implemented"); }
    template <>
    static const char* classType<A>()
    {
        static const char* s_classType = "A";
        return s_classType;
    }
};

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

答案 3 :(得分:0)

将函数声明为纯虚函数。

class A
{
public:
    virtual static const char* classType() =0;
};

然后,所有从A继承的实例化类都必须实现这一点。