gpt4 book ai didi

c++ - 如何在基类中定义静态接口(interface)并确保该接口(interface)必须在派生类中实现?

转载 作者:行者123 更新时间:2023-11-30 04:42:19 24 4
gpt4 key购买 nike

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

那是纯虚函数。

例如:

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

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

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

我想要这样的东西

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())。此外,不可能“强制”派生类实现静态接口(interface),因为没有静态接口(interface)这样的东西。因为您没有虚拟静态函数,所以您不能将引用或指针传递给将实现此函数的接口(interface)。

关于c++ - 如何在基类中定义静态接口(interface)并确保该接口(interface)必须在派生类中实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58788604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com