akapit poniżej ekstrahowano od strony 420 od Stroustup książce „C++ Programming Language” (wydanie trzecie):Myślę, że poniższe stwierdzenie jest nieprawidłowe lub czegoś brakuje?
Ponieważ wskaźnik do członka wirtualnego (s w tym przykładzie) jest rodzajem offset, nie zależy od lokalizacji obiektu w pamięci. Wskaźnik do wirtualnego elementu można zatem bezpiecznie przepuścić między różnymi przestrzeniami adresowymi, o ile ten sam układ obiektów jest używany w obu wersjach. Podobnie jak wskaźniki do zwykłych funkcji, wskaźniki do niewirtualnych funkcji składowych nie mogą być wymieniane między przestrzeniami adresowymi.
Sporuję ostatnie zdanie w tym akapicie. Poniżej znajduje się fragment kodu, w którym wskaźniki bez funkcji bez funkcji, foo()
i foo1()
są wymieniane między jednym obiektem bazowym a
i obiektem pochodnym b
, bez problemu.
Czego nie można zrobić, to przeciążenie dowolnej z funkcji bazy, foo()
lub foo1()
, w klasie pochodnej, ponieważ w tym przypadku kompilator wyśle błąd, jak pokazano poniżej.
#include <iostream>
class A
{
int i;
public:
A() : i(1) {}
void foo() { std::cout << i << '\n'; }
void foo1() { std::cout << 2 * i << '\n'; }
};
class B: public A
{
int j;
public:
B() : A(), j(2) {}
// void foo() { std::cout << j << '\n'; }
};
int main()
{
typedef void (A::* PMF)();
PMF p = &B::foo; // error C2374: 'p' redefinition, multiple initialization
// if foo() is overloaded in B.
PMF q = &B::foo1;
B b;
(b.*p)();
(b.*q)();
A a;
(a.*p)();
(a.*q)();
}
Moje czytanie "wymiany między przestrzeniami adresowymi" było czymś w rodzaju bezpośredniej transmisji wskaźnika do * innego procesu * w systemie operacyjnym. – ulidtko