I may be misunderstanding what you're asking but as I understand it you want the external view of the record to look like one thing, while the internal details are quite different.
Go a little further and hide the internal representation altogether.
package A is
type B is tagged private;
function c (Object : B) return Integer;
procedure c (Object : B; Value : Integer);
-- set_c is probably a better name!
private
-- the "private" part allows other code to allocate B
-- without seeing the implementation (package body)
type B is tagged record
c : Long_Integer;
end record;
end A;
The package body is easy to write, not shown here : it contains the implementations of the accessors, more or less as you wrote them.
Then you can use the package:
with Ada.Text_IO;
with A; -- assuming A is a separate pair of files, a.ads, a.adb.
-- Unnecessary if A is a package in the current file.
use A;
procedure test is
X : B;
begin
X.c(123); -- set value.
put_line("Value is " & integer'image(X.c));
end test;
NB this dot notation X.c is Ada-2005/2012 syntax. Ada-95 requires c(X) ... which is still valid and means the same thing.
Each package is also a namespace, so instead of use A;
you could explicitly write
procedure test is
X : A.B;
begin
X.c(123); -- set value
put_line("Value is " & integer'image(X.c));
end test;
EDIT : actually trying your worked example instead of just answering(!) :
(1) My mistake : I should have pointed out the object.prefix notation for subprograms applies to tagged types; adding "tagged" to C's declaration in package spec A resolves this.
type C is tagged private;
(2) function d cannot just rename a type conversion; wrap it as
function d (Object : C) return Integer is
begin
return Integer (Object.d);
end d;
and:
gnatmake test
gnatlink: warning: executable name "test" may conflict with shell command
./test
Value is 123