重载来自不同基类的同名虚函数.这可能吗?

Overloading virtual functions of the same name from different base classes. Is it possible?

本文关键字:函数 基类 重载      更新时间:2023-10-16

标题可能让人混淆。

假设我们有如下设置:

class A
{
public:
    virtual void fn() = 0;
};
class B
{
public:
    virtual int fn() {};
};
class C: public A, public B
{
};

是否有办法在class C中定义A::fn

C中没有办法指定C::fn()中的一个实现重载A::fn()(可能还有其他重载)B::fn())。但是,您可以做的是引入一个中间环节重命名的类函数,类似于:

class RemapA : public A
{
    virtual void fnInA() = 0;
public:
    virtual void fn()
    {
        fnInA();
    }
};
class RemapB : public B
{
    virtual int fnInB() = 0;
public:
    virtual int fn()
    {
        return fnInB();
    }
};
class C : public RemapA, public RemapB
{
    virtual void fnInA() { /* ... */ }
    virtual void fnInB() { /* ... */ }
    //  ...
};

。这是不可能的。它总是与fn()中的任何一个冲突。

fn()的语法不同,

void fn();  // in A

B

int fn();  // in B

你必须使这些语法在AB相同,让C实现fn()。演示。

您可能想要阅读我对以下问题的回答:由于多个抽象基类,实现具有相同名称但不同的非协变返回类型的两个函数简而言之:是的,只是在称呼上有一些限制。它可以作为A(指针或引用)或B(指针或引用)调用,但不能作为C调用,因为那样会有歧义。