Магия указателей
Навеяно вопросом Помогите исправить код, не понимаю, почему не работает. 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;
}