【问题标题】:How to defined a static interface in base class and make sure the interface must be implement in derived class?如何在基类中定义静态接口并确保接口必须在派生类中实现?
【发布时间】:2019-11-10 12:22:32
【问题描述】:

我们很容易确保派生类必须实现基类中定义的接口。

那是纯虚函数。

例如:

class BaseClass
{
...
virtual void print()=0;
...
}

class DerivedClass :public BaseClass
{
// function must be implement, otherwise compiler will complain ...
void print()
{
}
};

我们能否在基类中定义一个静态接口,并确保该接口必须在派生类中实现?

我想要这样的东西

class BaseClass
{
...
static void print(); // base class only define static interface
...
}

class DerivedClass :public BaseClass
{
// derived class must implement interface, otherwise compiler will complain ...
static void print()
{
}
};

我对此一无所知。

感谢您的宝贵时间。

【问题讨论】:

标签: c++


【解决方案1】:

无法创建虚拟静态函数。原因很简单,在调用静态函数时,您总是知道在编译时定义该函数的类。与虚函数不同,您不知道要调用其方法的 object 的类型。 例如:

class A
{
    public:
    virtual void f() {printf("A");}
};

class B : public A
{
    virtual void f() override {printf("B");}
};

void g(A& a)
{
    a.f();
}

int main()
{
    B b;
    g(b);
    return 0;
}

在上面的例子中,在函数 g 中,调用了正确的函数 (B::f)。即使在编译函数时,也不知道其参数的类型是什么(它可以是 A 或从 A 派生的任何类)。 如果不将 f() 设为虚拟,您将 重载 方法 f,而不是 覆盖 它。这意味着在以下示例中,输出将是“A”,即使您可能期望它是“B”:

class A
{
    public:
    void f() {printf("A");}
};

class B : public A
{
    void f() {printf("B");}
};

void g(A& a)
{
    a.f();
}

int main()
{
    B b;
    g(b);
    return 0;
}

这可能会导致严重的错误,建议永远不要重载基类方法,并在覆盖虚拟方法时始终使用override关键字来避免这些错误。

在制作静态函数时,可以简单地重载它,不会产生编译错误。但是,您可能永远不应该重载它,因为它可能隐藏了一个很难跟踪的错误(您确定 B::f() 正在被调用,而实际上 A::f() 正在被调用)。 此外,不可能“强制”派生类实现静态接口,因为不存在静态接口之类的东西。因为您没有虚拟静态函数,所以您不能将引用或指针传递给将实现此函数的接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 2014-06-17
    • 2010-09-22
    • 2013-09-30
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    相关资源
    最近更新 更多