C++ inherit from multiple base classes with the same virtual function name

前端 未结 4 1947
自闭症患者
自闭症患者 2020-11-28 16:47

I tried this code:

class A
{
    virtual void foo() = 0;
};

class B
{
    virtual void foo() = 0;
};

class C : public A, public B
{
    //virtual void A::f         


        
4条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-28 17:12

    A function overrides a virtual function of a base class based on the name and parameter types (see below). Therefore, your class C has two virtual functions foo, one inherited from each A and B. But a function void C::foo() overrides both:

    [class.virtual]/2

    If a virtual member function vf is declared in a class Base and in a class Derived, derived directly or indirectly from Base, a member function vf with the same name, parameter-type-list, cv-qualification, and ref-qualifier (or absence of same) as Base::vf is declared, then Derived::vf is also virtual (whether or not it is so declared) and it overrides Base::vf.

    As I already stated in the comments, [dcl.meaning]/1 forbids the use of a qualified-id in the declaration of a (member) function:

    When the declarator-id is qualified, the declaration shall refer to a previously declared member of the class or namespace to which the qualifier refers [...]"

    Therefore any virtual void X::foo(); is illegal as a declaration inside C.

    The code

    class C : public A, public B
    {
        virtual void foo();
    };
    

    is the only way AFAIK to override foo, and it will override both A::foo and B::foo. There is no way to have two different overrides for A::foo and B::foo with different behaviour other than by introducing another layer of inheritance:

    #include 
    
    struct A
    {
        virtual void foo() = 0;
    };
    
    struct B
    {
        virtual void foo() = 0;
    };
    
    struct CA : A
    {
        virtual void foo() { std::cout << "A" << std::endl; }
    };
    
    struct CB : B
    {
        virtual void foo() { std::cout << "B" << std::endl; }
    };
    
    struct C : CA, CB {};
    
    int main() {
        C c;
        //c.foo();  // ambiguous
    
        A& a = c;
        a.foo();
    
        B& b = c;
        b.foo();
    }
    

提交回复
热议问题