Имеем иерархию классов. Base <|- Derived <|- FinalClass <|- FinalClassEx
Почему при виртуальном наследовании Derived от Base нельзя возвратить объект из функции, а без него можно ?
class Base
{
public:
explicit Base(char const*) {}
Base() {}
Base(const Base&) = delete;
Base& operator=(const Base&) = delete;
};
class Derived : virtual public Base // Compiles without virtual
{
public:
Derived() {}
Derived(Derived&&) {}
Derived& operator=(Derived&&) { return *this; }
Derived(const Derived&) = delete;
Derived& operator=(const Derived&) = delete;
};
class FinalClass : public Derived
{
public:
FinalClass() {}
FinalClass(FinalClass&&) {}
FinalClass& operator=(FinalClass&&) { return *this; }
FinalClass(const FinalClass&) = delete;
FinalClass& operator=(const FinalClass&) = delete;
};
FinalClass f1()
{
FinalClass f;
return f;
}
class FinalClassEx : public FinalClass
{
public:
using FinalClass::FinalClass;
};
FinalClassEx f2()
{
FinalClassEx f;
return f;
}
int main()
{
auto v1 = f1();
auto v2 = f2();
return 0;
}