C++에서 : 가상 기능을 덮어 쓰지 않고 가상 기능을 덮어 쓰는 것과 다른 점은 무엇입니까? virtual
함께비 가상 함수 및 가상을 덮어 쓰는 것과 다른 점은 무엇입니까?
3
A
답변
8
:
class Base {
virtual void Foo() { std::cout << "Foo in Base" << std::endl;}
};
class Derived : public Base {
virtual void Foo() { std::cout << "Foo in Derived" << std::endl;}
};
// in main()
Derived* d = new Derived();
d->Foo(); // prints "Foo in Derived"
Base* b = new Derived();
b->Foo(); // prints "Foo in Derived"
와없이
(동일한 코드 있지만 아웃 떠나virtual
)
// in main()
Derived* d = new Derived();
d->Foo(); // prints "Foo in Derived"
Base* b = new Derived();
b->Foo(); // prints "Foo in Base"
그래서 차이 virtual
없이 진정한 런타임 다형성 없다이다 : 어떤 함수가 호출되는 포인터/참조의 현재 유형에 따라 컴파일러에 의해 결정됩니다. 런타임에, 당신은 그것의 가상 멤버 호출 할 때마다 - virtual
와
vtable
)의 목록을 유지 관리합니다. 이 샘플에서는
Foo
에 대한 항목이
Derived
생성자에 의해 겹쳐 쓰여진 함수를 가리 키도록 암시 적으로 수정되므로 -pointer를 통해
Foo
이 호출되는 것이 중요하지 않습니다.
0
가상 함수를 덮어 쓰면 런타임에 개체 유형이 평가되고 적절한 방법이 호출됩니다.
예 :
class Vehicle
{
public:
void PrintType(); // Prints "Vehicle"
};
class Car: public Vehicle
{
// overwrite PrintType to print "Car"
};
// In main
void main()
{
Vehicle *s = new Car();
s->PrintType(); // Prints "Vehicle"
// If PrintType was virtual then the type of s will be evaluated at runtime and the inherited function will be called printing "Car"
}
관련 문제
- 1. 구조체를 포인터로 intializating하는 것과 다른 점은 무엇입니까?
- 2. Janrain과 OAuth를 사용하는 것과 다른 점은 무엇입니까?
- 3. pip와 apt-get를 사용하여 패키지를 설치하는 것과 다른 점은 무엇입니까?
- 4. 전역 개체와 창 개체의 속성을 설정하는 것과 다른 점은 무엇입니까?
- 5. NetBeans에서 라이브러리와 .jar 파일을 추가하는 것과 다른 점은 무엇입니까?
- 6. en-US와 en_US의 로캘을 만드는 것과 다른 점은 무엇입니까?
- 7. 동영상의 i- 프레임을 덮어 쓰는 방법은 무엇입니까?
- 8. 함수 포인터 및 가상 함수
- 9. 다른 필드를 덮어 쓰는 레코드 필드
- 10. 가상 함수 및 클래스
- 11. NSObject의 해시 방법을 덮어 쓰는 데 권장되는 해시 함수
- 12. Objective C의 구현 컨텍스트 내부 및 외부에서 정적 변수를 선언하는 것과 다른 점은 무엇입니까?
- 13. AdPlus 및 WinDbg : AdPlus와 WinDbg를 함께 사용하는 것과 다른 점은 무엇입니까?
- 14. 보석보기를 덮어 쓰는 적절한 방법은 무엇입니까?
- 15. JQuery 플러그인 기능을 덮어 쓰는 방법은 무엇입니까?
- 16. XML 파일에서 노드를 덮어 쓰는 방법은 무엇입니까?
- 17. DevExpress GridView를 덮어 쓰는 방법은 무엇입니까?
- 18. web.config가 MetaBase.xml을 덮어 쓰는 이유는 무엇입니까?
- 19. 컴파일 된 (?) 스크립트를 덮어 쓰는 방법은 무엇입니까?
- 20. 파일의 일부 바이트를 덮어 쓰는 방법은 무엇입니까?
- 21. 루비 범위의 도트를 덮어 쓰는 방법은 무엇입니까?
- 22. jQuery가 때때로 window.onbeforeunload를 덮어 쓰는 이유는 무엇입니까?
- 23. Perl의 배열과 다른 점은 무엇입니까?
- 24. Android JVM의 다른 점은 무엇입니까?
- 25. 기본적으로 데코레이터를 덮어 쓰는 Zend_Form
- 26. 인라인 블록 및 기능 블록, 다른 점은 무엇입니까?
- 27. XHTML과 호환되는 점은 무엇입니까?
- 28. 가상 함수 후크/우회
- 29. Statement가 이미지를 덮어 쓰는 경우
- 30. C에서 stdout을 덮어 쓰는 방법
덮어 쓰기는 아무런 의미가 없습니다. 멤버 함수 숨기기, 재정의 또는 오버로드에 대해 묻고 싶습니까? 질문을 명확히하려면 여기에서 각각 검색하십시오. –
아무도 언급하지 않는 경우 : [The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)를 참조하여 직접 구매하십시오. C++에 대한 좋은 책. –