aşağıda Stroustup kitabında "C++ programlama dili" (üçüncü baskı), sayfa 420 ayıklandı paragraf: Çünkü bir işaretçi (bu örnekte s) sanal bir üyesineAşağıdaki ifadenin yanlış olduğunu mu düşünüyorsun ya da bir şey mi özlüyorum?
, ofset bir tür belleğe bir nesnenin konumuna bağlı değildir. Bu nedenle, sanal bir üyeye ait işaretçisi, 'da aynı nesne düzeni her ikisi de kullanıldığı sürece farklı adres boşlukları arasında güvenle iletilebilir. Sıradan işlevlere ilişkin işaretçiler gibi, sanal olmayan üye işlevlerine ilişkin işaretçiler adres boşlukları arasında değiştirilemez.
Bu paragraftaki son tümceye itiraz ediyorum. Aşağıda, nonvirtual üye işlevleri, foo()
ve foo1()
işaretçilerinin, bir taban nesnesi a
ve türetilmiş bir nesne b
arasında bir sorun olmadan değiştirildiği bir kod parçacığı bulacaksınız.
Yapılması gerekenler, türetilmiş sınıftaki foo()
veya foo1()
tabanındaki işlevlerden herhangi birinin aşırı yüklenmesi, bu durumda derleyici aşağıda gösterildiği gibi bir hata yayacaktır. , (Standart) C++, bir program ya da daha çok işlemde tam bir adres alanı vardır:
#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)();
}
"Adres alanları arasında değişim" okumam, bir işaretçinin bir işletim sisteminde * başka bir işleme * aktarılması gibi bir şeydi. – ulidtko