`virtual` in inheritance hierarchies also behaves differently so you can do fun stuff like this.
#include <iostream>
class Other
{
public:
virtual ~Other() = default;
virtual void g() = 0;
};
class Other1 : virtual public Other
{
public:
virtual ~Other1() = default;
virtual void g() override
{
std::cout << "other1" << "\n";
}
};
class Other2 : virtual public Other
{
public:
virtual ~Other2() = default;
virtual void g() override
{
std::cout << "other2" << "\n";
}
};
class Base : virtual public Other
{
public:
virtual ~Base() = default;
virtual void f() = 0;
};
class Derived1 : public Base, virtual public Other1
{
public:
virtual ~Derived1() override = default;
virtual void f() override
{
std::cout << "Derived1" << "\n";
}
};
class Derived2 : public Base, virtual public Other2
{
public:
virtual ~Derived2() override = default;
virtual void f() override
{
std::cout << "Derived2" << "\n";
}
};
int main()
{
Base *d1 = new Derived1;
Base *d2 = new Derived2;
d1->f();
d1->g();
d2->f();
d2->g();
delete d1;
delete d2;
}