8번 깜빡한게 있습니다.
정적선언이면 상관없지만 동적선언의 경우
delete a;
를 해 주어야합니다. Garbage Collection 이 없으니까요.
오버라이딩을 할 때
객체에서 가상함수가 만들어지면 그 함수를 항상 추적하게되며,
많은 컴파일러들이 가상함수테이블을 만들고 여기에 각각의 가상함수를 저장합니다.
그리고 객체는 이 가상테이블의 포인터(vptr 또는 v-pointer)를 유지합니다.
부모클래스 변수에 자식 객체를 대입해 호출하면
virtual function 이 아니면 부모클래스의 함수가 호출될 겁니다. (확인안해봄...쿨럭)
virtual function 이면 가상테이블에 의해 자식클래스의 함수가 호출됩니다.
자바의 오버라이딩란게 이 두가지 중 어떤 방식으로 동작이 되는지 모르겠습니다.
추측컨데 가상함수를 사용한 방식이겠죠...
pd 님이 쓰신 글 :
: 더 궁금한점만 아래에 추가하였습니다.
:
: 1.
: 2.
: 3.
: 4.
:
: 5.
:
: 6. this가 포인터라는걸 몰랐습니다.
: 자바에서는 전부다 쩜(.)으로 통일했지만. C++에서는 쩜이아니라.
: ->도쓰므로..
:
:
: 7.
:
: 8. 제가 사용해봤는데.
: 뭐 저렇게 써도되더라구요
: 아 제가 질문했던의도는
: 선언을 저렇게하고
: 또사용을 저렇게 하는가였습니다.
: 저도 . 과 ->의 차이는 알고있었습니다.
: 그런데 여기와서 좀더 구체적인 설명이되니 더 자세하게 알수있었습니다.
:
:
: 9. 가상 함수라는게 자바의 오버로딩과 오버라이딩을 말하는건가요?
: 설명이 비슷한거같습니다.
:
: 두분설명고맙습니다.
: 하지만 두분이 정확하게 자바에대해 모르신거같아서 답변이 약간모호하긴했습니다.
: 제생각엔 두분의 말씀을 참고하고 또 제가 참고한 책을 보니까
: 9번의 경우는 가상함수라는게 오버라이딩을 의미하는것같습니다.
:
: 즉 가상함수는 오버라이딩을 위한 기능이다라고하면 자바에서는 오버라이딩을 지원하므로
: 자바에서도 지원하는기능이다라는 결론이 생깁니다.
:
:
:
:
: 아루스 님이 쓰신 글 :
: : pd 님이 쓰신 글 :
: : : 답변고맙습니다.
: : : 그런데 궁금한점이있습니다.
: : : 제가 아직 잘몰라서그러는데 아래의 궁금한점이있습니다.
: : : 1. 굵은글씨의 의미와 왜 거기에 써야하는지요
: : 밑에 다 써있네요.
: : IniFiles.hpp 를 include 하는건 TIniFile 객체를 사용하기 위함이죠.
: :
: : : 2. 특히 인클루드는 한꺼번에 묶을수도있을거같은데 그렇게 안하시는걸 보니무슨이유가있을거같고
: : include 를 한꺼번에 묶는 다는 말은 한곳에 다 작성을 한다는 뜻인가요.
: : 이 소스는 그래도 되겠네요. 전 그렇게 써요 ㅎㅎ
: : cpp 파일에 다 작성해도 되겠네요. 만약 헤더파일에 TIniFile class 가 선언되거나 했다면 저대로 꼭 써야하구요.
: :
: : : 3. #endif를 헤더파일전체로 감싸게 하는것도 이유가있을거같습니다.
: : 헤더를 #ifndef - #endif 로 묶는 것은 두번 include 를 할 경우 문제가 되기때문에 최초 include 시에만 내용이 적용 되도록 합니다.
: :
: : : 4. 또한 왜 String를 쓰지않고 AnsiString를 쓰는건지도 궁금합니다.
: : String 은 BCB 도움말에 Delphi AnsiString 이라고 나와있네요.
: :
: : : 5. 그리고 왜 헤더파일이 아닌곳에 인클루드를사용해 vcl.h를 호출하였습니까?
: : vcl.h 파일은 헤더에서 필요하지 않기 때문이죠.
: : 자동 생성되는 코드만 봐도 cpp 에서 include 되더군요.
: :
: : : 6. 그리고 메서드에서 this.Host로 받고싶은데 해보니까 그렇게하면 오류가뜨고 this->Host로 써야하던데
: : : 잘못된것아닐까요?
: : this 는 자기 자신을 가리키는 포인터 입니다.
: :
: : : 7. __fastcall 이것의 의미는 무엇인지요?
: : : 인터넷에는 좀복잡하게 나와있던데. 쉽게 설명좀부탁드립니다.
: : :
: : 함수 호출 규약은 "김태선" 님이 자세히 설명 해 주신게 있네요.
: :
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tutorial&no=120
: :
: : : 8. 다른 모듈에서 Host를 부를때
: : : IniFile a = new IniFile();
: : : a.getHost("ddd");
: : : 이렇게 쓰는게 맞나요?
: : : 자바틱하게 썼는데 맞는지모르겠습니다.
: : :
: : IniFile a;
: : a.getHost("ddd");
: : 로 정적 선언을 하여 호출하던가
: :
: : IniFile *a = new IniFile();
: : a->getHost( "ddd" );
: : 로 동적 선언을 하여 호출하시면 되겠네요.
: :
: : : 9. 가상 함수라는게 자바의 오버로딩과 오버라이딩을 말하는건가요?
: : : 설명이 비슷한거같습니다.
: : 자바를 잘 모르네요;; 이 부분은 책을 인용하겠습니다.
: :
: : Mammal 는 Dog 의 부모클래스라는 가정하에...
: :
: : C++은 베이스 클래스를 가리키는 포인터에 파생 클래스 객체가 대입되도록 하는 다형성을 지원합니다. 따라서
: : Mammal *pMammal = new Dog;
: : 가 가능합니다.
: : 이는 새로운 Dog 객체를 힙에 만들고 그 객체의 포인터를 반환하여 이를 Mammal 을 가리키는 포인ㅌ터에 치환합니다. 이는 좋습니다. 왜냐하면 Dog는 Mammal 의 한 종류이기 때문입니다.
: : 그 다음에 여러분은 이 포인터를 사용하여 Mammal 상의 어떠한 메쏘드도 호출할 수 있습니다. 여러부닝 하고 싶은 것은 Dog()에서 재생(오버라이딩)된 메쏘드가 자신의 함수를 호출할 수 있도록 하는 것입니다. 가상 함수가 이를 가능케 하여줍니다.
: :
: : #include <iostream.h>
: : class Mammal
: : {
: : public:
: : Mammal(){}
: : virtual void speak() const { cout << "Mammal speak!" << endl; }
: : }
: : class Dog : public Mammal
: : {
: : public:
: : Dog(){}
: : void speak() const { cout << "Woof!" << endl; }
: : }
: : 를 선언하고
: : Mammal *mammal = new Dog;
: : mammal->speak(); // <- 이부분에서 Mammal speak! 이 아닌 Woof! 가 출력됩니다 ~_~
: :
: : :
: : :
: : : 이정구 님이 쓰신 글 :
: : : :
: : : :
: : : : //---------------------------------------------------------------------------
#ifndef CommonFunctionH
#define CommonFunctionH
#include "IniFiles.hpp"
//---------------------------------------------------------------------------
class IniFile
{
private:
AnsiString Host;
public:
int getHost(String execpath);
};
#endif
#include
#pragma hdrstop
#include "CommonFunction.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
int IniFile::getHost(String execpath)
{
TIniFile *IniFile = new TIniFile(execpath);
Host = IniFile->ReadString("LoginSection", "Host", "127.0.0.1");
delete IniFile;
return 0;
}
위에서 굵게 표시한 부분처럼 수정해 보세요.