Чтобы вызвать вашу виртуальную функцию-член 'pure', вам нужен экземпляр 'D'. Существует скрытый скрытый параметр (это). Вы не можете вызвать функцию, не передав ей необходимые параметры.
Вы можете добавить параметр в Nested :: function:
class Nested
{
public:
void function(Outer& outer)
{
outer.pure();
}
};
Или можете сохранить ссылку:
class Nested
{
public:
Nested(Outer& outer) : outer{outer} {}
void function()
{
outer.pure();
}
private:
Outer& outer;
};
Для второй версии вы можете предоставить заводскую функцию:
class Outer
{
public:
class Nested
{
public:
Nested(Outer& outer) : outer{outer} {}
void function()
{
outer.pure();
}
private:
Outer& outer;
};
virtual void pure() = 0;
auto make_nested()
{
return Nested{*this};
}
};
Использование:
class Derived : public Outer
{
public:
void pure() override
{
printf ("pure\n");
};
};
int main()
{
Derived derived;
auto nested = derived.make_nested();
nested.function(); // calls pure
return 0;
}