当另一个成员存在另一个签名时,调用纯虚拟成员的正确方法是什么?

cpp*_*guy 1 c++ inheritance pure-virtual

我有一个纯虚拟接口类和一个看起来像这样的派生类

class IInterface
{
public:
    virtual void func() = 0;
};

class MyClass : public IInterface
{
public:
    void func(int i) { func(); }
};
Run Code Online (Sandbox Code Playgroud)

编译器抱怨对func()in 的调用func(int i)不带0个参数.指定调用纯虚拟成员的正确方法是什么?

我提出的两个解决方案是

void func(int i) { static_cast<IInterface*>(this)->func(); }
Run Code Online (Sandbox Code Playgroud)

void func(int i) { IInterface::func(); }
Run Code Online (Sandbox Code Playgroud)

这些都可行吗?有没有更好的办法?两者看起来都很笨拙.

T.C*_*.C. 6

使用using-declaration将基类声明带入派生类范围:

class MyClass : public IInterface
{
public:
    using IInterface::func;
    void func(int i) { func(); }
};
Run Code Online (Sandbox Code Playgroud)

或者,转换this为指向base的指针也可以工作(即,您的第一个选项):

void func(int i) { static_cast<IInterface*>(this)->func(); }
Run Code Online (Sandbox Code Playgroud)

IInterface::func(); 不起作用,因为显式限定禁用虚拟调度.