如何在基类中定义静态接口,并确保该接口必须在派生类中实现
How to defined a static interface in base class and make sure the interface must be implement in derived class?
我们可以很容易地确保派生类必须实现基类中定义的接口。
这是纯粹的虚拟函数。
例如:
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(。此外,不可能"强制"派生类实现静态接口,因为不存在静态接口。因为没有虚拟静态函数,所以可能不会将引用或指针传递给将实现此函数的接口。
相关文章:
- 如何从实现接口的模板化类实例访问结构
- 传递实现特定接口的类
- 如何在C++中实现接口
- C++ 使用接口和默认实现继承
- unique_ptr实现接口时对已删除函数的引用
- C++接口实现和子类化对象识别
- 接口实现和私有继承之间的交互
- Pimpl习惯用法、单独的接口/实现文件和多个虚拟继承.如何
- 定义大量的接口实现
- cpp文件中的纯虚拟接口实现
- 如何使用接口实现回调
- 继承接口实现
- 如何在C++中编写类java参数级接口实现
- 具有其他默认参数的接口实现
- Mixin和接口实现
- 如何在许多类中重用接口实现
- Emscripten Javascript接口实现
- 获取Firefox内置组件的接口实现
- c++中的头文件和Java中的抽象类/接口实现是相同的想法,这是正确的吗?
- C++中的接口+实现:代码不执行