从不同的基类重载同名的虚函数。可能吗?

时间:2011-09-06 11:55:41

标签: c++ inheritance virtual-functions override

标题可能令人困惑。

假设我们有以下设置;

class A
{
public:
    virtual void fn() = 0;
};

class B
{
public:
    virtual int fn() {};
};

class C: public A, public B
{
};

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

即可。这是不可能的。它始终与fn()

中的任何一个冲突

fn()的语法不同,

void fn();  // in A

并在B中,

int fn();  // in B

您必须在AB中使这些语法相同,才能让C实现fn()Demo

答案 2 :(得分:1)

您可能希望阅读我对以下问题的回答:Implement two functions with the same name but different, non-covariant return types due to multiple abstract base classes 简而言之:是的,在调用它时有一些限制。它可以被称为A(指针或引用)或B(指针或引用),但不能被称为C,因为它是不明确的。