C '객체 모델은 상속, 다형성 및 캡슐화와 같은 기능을 지원하기위한 컴파일 타임 및 런타임 메커니즘의 조합을 기반으로합니다. 핵심적으로, 그것은 객체를 만드는 청사진으로 클래스의 개념에 의존합니다. 각 객체는 데이터 (멤버 변수)와 코드 (멤버 함수)를 모두 포함하는 클래스 인스턴스입니다.
상속 : 상속을 통해 기존 클래스 (기본 클래스)를 기반으로 새로운 클래스 (파생 클래스)를 생성 할 수 있습니다. 파생 클래스는 기본 클래스의 멤버 (데이터 및 기능)를 상속 받고 자체 구성원을 추가하거나 기존 회원을 재정의 할 수 있습니다. 이것은 코드 재사용을 촉진하고 "IS-A"관계를 설정합니다. 예를 들어, Dog
수업은 Animal
계급에서 물려받을 수 있습니다.
가상 함수 : 가상 함수는 기본 클래스의 virtual
키워드로 선언 된 멤버 기능입니다. 런타임 다형성을 활성화합니다. 즉, 호출 할 올바른 기능은 선언 된 유형이 아니라 객체의 실제 유형에 따라 런타임에서 결정됩니다. 이것은 유연성과 확장 성을 달성하는 데 중요합니다. 이것의 메커니즘은 가상 함수 테이블 (vtable) 입니다. 가상 함수가있는 각 클래스에는 고유 한 Vtable이 있으며 해당 클래스에서 구현 된 가상 함수에 대한 포인터 테이블입니다. 가상 함수를 포함하는 클래스의 각 객체에는 클래스의 vtable을 가리키는 숨겨진 포인터 (종종 VPTR)가 있습니다. 가상 함수가 호출되면 런타임은 VPTR을 사용하여 vtable에서 올바른 함수를 찾습니다.
예:
<code class="c ">class Animal { public: virtual void makeSound() { std::cout makeSound(); // Calls Dog::makeSound() due to virtual function delete animal; return 0; }</code>
이 예에서 makeSound
가상 기능입니다. animal
Animal
포인터로 선언 되더라도, 개 클래스에서 올바른 makeSound
함수 ( Dog
클래스에서)가 vtable 메커니즘으로 인해 런타임에 호출됩니다.
가상 함수를 사용하면 비가적인 함수와 비교하여 성능 오버 헤드가 소개됩니다. 이 오버 헤드는 몇 가지 요인에서 비롯됩니다.
그러나, 이러한 오버 헤드는 일반적으로 작고 종종 무시할 수 있으며, 특히 가상 기능이 제공하는 다형성 및 코드 유지 가능성의 이점과 비교할 수 있습니다. 최신 컴파일러는 다양한 최적화 기술을 사용하여 인라인 및 기능 포인터 캐싱과 같은 가상 기능의 성능 영향을 최소화합니다. 성능 영향은 가상 함수가 코드의 성능-크리티컬 섹션 내에서 호출 될 때만 중요하며, 그럼에도 불구하고 함수를 매우 많은 시간이라고 불리지 않는 한 차이는 종종 한계입니다.
C 상속은 여러 가지 방법으로 메모리 관리 및 객체 크기에 영향을 미칩니다.
unique_ptr
, shared_ptr
)는 이러한 시나리오에서 메모리 관리를 단순화 할 수 있습니다.정적 디스패치 및 동적 디스패치는 런타임에 호출 할 기능을 결정하는 두 가지 방법입니다. 주요 차이점은 결정이 내려 질 때 입니다.
차이점을 나타내는 예 :
<code class="c ">class Animal { public: void makeSound() { std::cout makeSound(); // Static dispatch: Calls Animal::makeSound() animal->move(); // Dynamic dispatch: Calls Dog::move() delete animal; return 0; }</code>
이 예에서 makeSound
가상이 아니기 때문에 정적 디스패치를 사용하지만 move
가상이기 때문에 동적 디스패치를 사용합니다. 이것은 virtual
키워드의 존재 (또는 부재)가 파견 메커니즘을 지시하는 방법을 보여줍니다.
위 내용은 가상 함수 및 상속을 포함하여 C '객체 모델은 어떻게 작동합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!