如何在基类中定义静态接口,并确保该接口必须在派生类中实现

How to defined a static interface in base class and make sure the interface must be implement in derived class?

本文关键字:接口 实现 确保 派生 基类 定义 静态      更新时间:2023-10-16

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

这是纯粹的虚拟函数。

例如:

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()
{
}
};

我对此一无所知。

谢谢你抽出时间。

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

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(。此外,不可能"强制"派生类实现静态接口,因为不存在静态接口。因为没有虚拟静态函数,所以可能不会将引用或指针传递给将实现此函数的接口。