Магия указателей

Навеяно вопросом Помогите исправить код, не понимаю, почему не работает. c++

На делфи такой фокус проворачивается достаточно легко, если я верно понимаю что происходит... но как это провернуть на плюсах?

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  A = class
    procedure f(i :Integer);overload;
    procedure f(i :string);overload;
  end;
  B = class(A)
    procedure f();overload;
    procedure f(i :string);overload;
  end;
  C = class
  end;

procedure A.f(i: integer);
begin
  Writeln('A::');
end;
procedure A.f(i :string);
begin
  Writeln('A::string');
end;

procedure B.f();
begin
  Writeln('B::');
end;
procedure B.f(i :string);
begin
  Writeln('B::string');
end;

var
  p: C;
begin
  p := C(@B.Create);
  B(@p).f();
  B(@p).f(0);
  B(@p).f('');
  A(@p).f('');
  Readln;
end.

Вывод:

B::
A::
B::string
A::string

Ответы (1 шт):

Автор решения: AR Hovsepyan

В С++ нужно явно выразить для объекта какого типа вызывается (не виртуальная)функция .

struct A {
    void f(int) 
    {  cout << "A::\n" ;  }
    void f(std::string)
    {  cout << "A::string\n";  }
};
struct B : A {
    void f() 
    {  cout << "B::\n"; }
    void f(std::string) 
    {  cout << "B::string\n" ;  }
};

int main() {
    B* p = new B;
    //B::f()
    p->f();
    //создать А по B*, чтобы вызвать А::f(int)
    A(*p).f(0);
    //B::f(string)
    p->f("");
    //создать А по B*, чтобы вызвать А::f(string)
    A(*p).f("");
    //освободить участок памяти
    delete p;
    return 0;
}
→ Ссылка