이 잘 나는 많은 일이 있기 때문에 우리가 생각할 수있는, 자신을 위해 그것을 테스트에 대한 :
#include <iostream>
using namespace std;
class A
{
public:
virtual void v() { cout << "A virtual" << endl; }
void f() { cout << "A plain" << endl; }
};
class B : public A
{
public:
virtual void v() { cout << "B virtual" << endl; }
void f() { cout << "B plain" << endl; }
};
class C : public B
{
public:
virtual void v() { cout << "C virtual" << endl; }
void f() { cout << "C plain" << endl; }
};
int main()
{
A * a = new C;
a->f();
a->v();
((B*)a)->f();
((B*)a)->v();
}
출력 :
A plain
C virtual
B plain
C virtual
나는, 좋은 간단하고 짧은 대답이 수도 있다고 생각 (더 많은 것을 이해할 수있는 사람들이 덜 기억할 수 있기 때문에 짧고 간단한 설명이 필요합니다.)
가상 메소드는 포인터의 데이터를 확인합니다. 반면에 고전적인 방법은 지정된 유형에 상응하는 방법을 호출하지 않습니다.
해당 기능의 요점은 다음과 같습니다. A의 배열이 있다고 가정합니다. 배열에는 B, C, 또는 파생 된 유형이 포함될 수 있습니다. 모든 인스턴스의 동일한 메소드를 순차적으로 호출하려면 오버로드 된 인스턴스를 각각 호출해야합니다.
나는 이것을 이해하기가 매우 까다 롭다. 분명히 모든 C++ 과정은 이것이 어떻게 달성되는지 설명해야한다. 왜냐하면 대부분의 경우 가상 함수에 대해 가르쳐야하기 때문에 컴파일러가이를 이해하는 방법을 이해할 때까지 실행 파일이 호출을 처리하는 방법, 당신은 어둠 속에 있습니다.
VFtables에 대한 것은 내가 어떤 종류의 코드를 추가했는지 설명하지 못했고 C++은 C보다 많은 경험이 필요하며 분명히 C++이 "느리게"라는 레이블이 붙은 이유 일 것입니다. 초기에는 강력합니다. 그러나 모든 것과 마찬가지로, 사용법을 아는 것이 강력합니다. 그렇지 않으면 단지 "다리를 날려 버리십시오".
명백한 예가 많이 인정되었을 것입니다. – jokoon