LINUX.ORG.RU

История изменений

Исправление asaw, (текущая версия) :

Смешивать множественное наследование и виртуальные функции в с++ - это ад. В большинстве случаев оно вообще не соберётся, а если и соберётся, то могут возникнуть забавные казусы.

Интересно, что это за «большинство случаев» такое? Вот этот вот код не соберется? Или тут должны возникнуть какие-то забавные казусы, может быть?

#include <iostream>

int main()
{
    struct B1 {
        virtual void foo() { std::cout << "B1::foo" << std::endl; }
    };

    struct B2 {
        virtual void foo() { std::cout << "B2::foo" << std::endl; }
    };

    struct C1 : B1, B2 {
        void foo() override { std::cout << "C1::foo" << std::endl; }
    };

    C1 c1;
    B1& rb1{c1};
    B2& rb2{c1};
    
    c1.foo();
    rb1.foo();
    rb2.foo();
}

Исходная версия asaw, :

Смешивать множественное наследование и виртуальные функции в с++ - это ад. В большинстве случаев оно вообще не соберётся, а если и соберётся, то могут возникнуть забавные казусы.

Интересно, что это за «большинство случаев» такое? Вот этот вот код не соберется? Или тут должны возникнуть какие-то забавные казусы, может быть?

#include <iostream>

int main()
{
    struct B1 {
        virtual void foo() { std::cout << "B1::foo" << std::endl; }
    };

    struct B2 {
        virtual void foo() { std::cout << "B2::foo" << std::endl; }
    };

    struct C1 : B1, B2 {
        void foo() { std::cout << "C1::foo" << std::endl; }
    };

    C1 c1;
    B1& rb1{c1};
    B2& rb2{c1};
    
    c1.foo();
    rb1.foo();
    rb2.foo();
}