Bu mümkün değil, ama bu sadece bir ihmal yüzünden. Birçok insanın iddia ettiği gibi "anlamsız" bir şey değil. Açık olmak gerekirse, bunun gibi bir şeyden bahsediyorum:
struct Base {
static virtual void sayMyName() {
cout << "Base\n";
}
};
struct Derived : public Base {
static void sayMyName() override {
cout << "Derived\n";
}
};
void foo(Base *b) {
b->sayMyName();
Derived::sayMyName(); // Also would work.
}
Bu% 100 şeydir olabilir (sadece değil vardır) uygulanacak ve ben yararlı bir şey iddia ediyorum.
Normal sanal işlevlerin nasıl çalıştığını düşünün. S'yi kaldırın static
ve başka şeyler ekleyin ve elimizde:
struct Base {
virtual void sayMyName() {
cout << "Base\n";
}
virtual void foo() {
}
int somedata;
};
struct Derived : public Base {
void sayMyName() override {
cout << "Derived\n";
}
};
void foo(Base *b) {
b->sayMyName();
}
Bu iyi çalışır ve temelde ne olur derleyici VTables adlı iki tablo yapar ve böyle sanal işlevlere endeksler atar
enum Base_Virtual_Functions {
sayMyName = 0;
foo = 1;
};
using VTable = void*[];
const VTable Base_VTable = {
&Base::sayMyName,
&Base::foo
};
const VTable Derived_VTable = {
&Derived::sayMyName,
&Base::foo
};
Daha sonra sanal işlevlere sahip her sınıf, VTable'ı işaret eden başka bir alanla artırılır, böylece derleyici temel olarak bunları şu şekilde değiştirir:
struct Base {
VTable* vtable;
virtual void sayMyName() {
cout << "Base\n";
}
virtual void foo() {
}
int somedata;
};
struct Derived : public Base {
VTable* vtable;
void sayMyName() override {
cout << "Derived\n";
}
};
O zaman aradığınızda gerçekte ne olur b->sayMyName()
? Temel olarak bu:
b->vtable[Base_Virtual_Functions::sayMyName](b);
(İlk parametre olur this
.)
Tamam, peki statik sanal işlevlerle nasıl çalışır? Peki, statik ve statik olmayan üye fonksiyonları arasındaki fark nedir? Tek fark, ikincisinin bir this
işaretçi almasıdır.
Aynı şeyi statik sanal işlevlerle de yapabiliriz - sadece this
işaretçiyi kaldırın .
b->vtable[Base_Virtual_Functions::sayMyName]();
Bu daha sonra her iki sözdizimini de destekleyebilir:
b->sayMyName(); // Prints "Base" or "Derived"...
Base::sayMyName(); // Always prints "Base".
Bu yüzden tüm muhalifleri görmezden gelin. Bu does mantıklı. O zaman neden desteklenmiyor? Bunun çok az yararı olduğu ve hatta biraz kafa karıştırıcı olabileceği için düşünüyorum.
Normal bir sanal işleve göre tek teknik avantaj, işleve geçmeniz gerekmemesidir, this
ancak bunun performansta ölçülebilir bir fark yaratacağını düşünmüyorum.
Bir örneğiniz olduğunda ve bir örneğiniz olmadığında durumlar için ayrı bir statik ve statik olmayan fonksiyonunuz olmadığı anlamına gelir, ancak aynı zamanda kullandığınızda bunun gerçekten "sanal" olması kafa karıştırıcı olabilir örnek çağrısı.
const
bir yöntem imzasında örtükthis
işaretçiyi sabit olarak işaretler ve örtük parametreden yoksun oldukları için statik yöntemlere uygulanamaz.