가능하지 않지만 그것은 단지 누락 때문입니다. 많은 사람들이 주장하는 것처럼 "이해가되지 않는"것은 아닙니다. 분명히하기 위해, 나는 이것에 대해 이야기하고 있습니다 :
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.
}
이것은 구현 될 수 있는 100 % 무언가 (단지 그렇지 않은 것)이며 유용한 무언가를 주장 할 것입니다.
일반적인 가상 기능의 작동 방식을 고려하십시오. static
s를 제거하고 다른 것들을 추가하면 다음이 있습니다.
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();
}
이것은 잘 작동하며 기본적으로 컴파일러는 VTables라는 두 테이블을 만들고 가상 함수에 인덱스를 다음과 같이 할당합니다.
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
};
다음으로 가상 함수가있는 각 클래스에는 VTable을 가리키는 다른 필드가 추가되므로 컴파일러는 기본적으로 다음과 같이 변경합니다.
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";
}
};
그러면 실제로 전화하면 어떻게됩니까 b->sayMyName()
? 기본적으로 이것은 :
b->vtable[Base_Virtual_Functions::sayMyName](b);
첫 번째 매개 변수는 this
입니다.
좋아, 정적 가상 함수와 어떻게 작동합니까? 정적 멤버 함수와 비 정적 멤버 함수의 차이점은 무엇입니까? 유일한 차이점은 후자가 this
포인터를 얻는다는 것 입니다.
정적 가상 함수로 정확히 동일한 작업을 수행 할 수 있습니다 this
. 포인터 만 제거하면 됩니다.
b->vtable[Base_Virtual_Functions::sayMyName]();
그러면 두 구문을 모두 지원할 수 있습니다.
b->sayMyName(); // Prints "Base" or "Derived"...
Base::sayMyName(); // Always prints "Base".
따라서 모든 naysayers를 무시하십시오. 그것은 않습니다 메이크업 감각. 왜 지원되지 않습니까? 나는 그것이 이익이 거의 없으며 약간 혼란 스러울 수 있기 때문이라고 생각합니다.
일반적인 가상 기능에 대한 유일한 기술적 이점은 기능에 전달할 필요 this
는 없지만 성능에 측정 가능한 차이를 만들지 않는다는 것입니다.
즉, 인스턴스가 있거나 인스턴스가없는 경우에 대해 별도의 정적 및 비 정적 함수가 없으며 사용시 실제로 "가상"이라고 혼동 할 수도 있습니다. 인스턴스 호출.
const
, 메서드 시그니처에서는 암시 적this
포인터를 상수로 플래그 지정하고 암시 적 매개 변수가 없기 때문에 정적 메서드에는 적용 할 수 없습니다.