在不使用虚拟方法的情况下静态强制C ++类接口

时间:2018-08-01 14:18:10

标签: c++

我有一个父母和孩子班级:

class Parent
{
    virtual void mustDefine() = 0;
};

class Child : public Parent
{
    virtual void mustDefine(){}
};

我想强制Parent的所有子类实现mustDefine()。但是,我的对象类型在编译时是已知的,因此我不希望进行多态v表查找。

是否存在强制子类实现父方法的静态方法?

3 个答案:

答案 0 :(得分:3)

如果需要通过在派生类中实现相同名称的函数来强制程序员隐藏基类成员函数,则...使基类成员函数未定义。尝试调用它会导致链接器错误和构建失败。

如果您的用户不要尝试调用该函数,则该构建仍将起作用,而对于虚函数则不一定如此。但是你在乎吗?

struct Parent
{
    void mustDefine();
};

struct Child : Parent
{
    // Link failure if this is missing, due to call in main().
    // That's because, without Child::mustDefine() hiding
    // Parent::mustDefine(), lookup for `mustDefine` will find
    // Parent::mustDefine() instead... which is, well, undefined.
    void mustDefine() {}
};

int main()
{
    Child c;
    c.mustDefine();
}

答案 1 :(得分:1)

最明显的方法是使用模板,尽管我强烈建议您不要使用这种代码,但最好不要这样做:

template<Impl>
void thing(Impl thingy) {
    thingy.mustDefine();
}

结果将是Impl必须具有函数“ mustDefine”,否则会出现编译错误,但这确实是维护的噩梦。人们不会知道Impl到底是什么,当他们决定要编写一个新的Impl时,就无法列出需要实现的全部内容。

我建议这是一个XY问题,并解决您不想调用虚拟方法的原因。

答案 2 :(得分:0)

您在这里不需要import urllib2 for line in urllib2.urlopen("http://mertatilgan.tk/dork.txt"): print line while(True):pass 。您拥有的是Named Requirement

class Parent