2010-07-24 4 views
1

궁금 해서요 :이 작업을 수행 할 수 있습니까? 다음이 가능했던 경우

class foo 
{ 
    virtual void bar(); 
} 

class izy : public foo 
{ 
int a; 
virtual void bar() 
{ 
    a = 2; 
} 
} 

foo *anyfoo = new izy; 
anyfoo.bar(); 

기본적으로 내가 알고 싶은이, 내가 변수 a를 추가 할 수 있습니다 또는 기본 클래스 foo는 그것의 일부가 아닌 이후 nonexistant 될 것인가?

+4

예를 들어 a) private이기 때문에 & b) 객체에 대한 포인터를 통해 메소드를 호출하는 잘못된 구문을 사용하고 있기 때문에 'bar'를 호출 할 수 없습니다 ...

+0

[ 알아보십시오] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). :) – GManNickG

+0

질문의 제목은 약하고 포괄적이며 제대로 작성되지 않았습니다. 이와 같은 제목은 커뮤니티에서 가장 많은 관심을 얻습니다. 잘 했어! 20 분 이내에 60 회 이상의 조회수. – karlphillip

답변

3

예, 하위 클래스에 새로운 변수 및 메소드를 추가 할 수 있습니다.

1

상속은 파생 클래스에서 새로운 변수를 허용합니다. 달성하고자하는 것은 다형성입니다.이 경우에는 기본 클래스 유형에 대한 포인터를 사용하여 방지됩니다.

1

코드에서 foo::bar()으로 전화 할 것입니다. a (izy::bar)을 수정하는 함수를 호출하려면 bar을 가상으로 만들어야합니다.


당신은 당신이 public 섹션으로 bar 이동 있을지 bar 가상 코드가 a 변경됩니다했습니다 후. anyfooizy 클래스의 인스턴스를 가리키며 a을 포함합니다.

1

코드를 사용하면 코드가 foobar이되어 izy의 바가 아니기 때문에 원하는대로 작동하지 않습니다. bar을 가상으로 변경하면 의도 한대로 작동합니다. izy 클래스에만 존재하는 a은 문제가되지 않습니다.

+0

하지만 인스턴스는 izy 인스턴스입니다. orginial 메소드를 오버라이드 (override)합니다. – mhshams

+2

@mohammad :하지만 포인터는 방정식에서'izy'에 관한 어떤 것도 제거하는'foo *'형식을 가지고 있습니다. 함수가'virtual'으로 표시되면 의도 한대로 다형성 (polymorphic) 동작을 얻게됩니다.편집 : 물론 질문은 이제 가상 포함하도록 편집됩니다. – GManNickG

+1

@mohammadshamsi : 가상 함수 만 재정의됩니다. 이름이 같은 두 개의 비 가상 함수를 정의하면 다형성을 얻지 못하고 동일한 이름을 가진 두 개의 함수를 얻게됩니다. 기본 클래스 포인터를 통해 비 가상 함수에 액세스하면 기본 클래스의 함수를 호출합니다. – sepp2k

0

예, 함수 및 변수와 같은 새 속성을 추가 할 수 있습니다. 상속을 사용하면 부모 클래스의 public 및 protected 속성을 사용할 수 있습니다. 또한 bar() 함수에서했던 것처럼 해당 속성을 읽을 수 있습니다.

감사

0

나는 변수 a를 추가 할 수 있습니다 또는 기본 클래스 foo는 그것의 일부가 아닌 이후 nonexistant 될 것인가?

다른 답변은 아직 알려지지 않았습니다. 귀하의 변수는 foo이 아니며 foo*입니다. 그것은 불확정 크기의 메모리의 다른 영역에 대한 포인터입니다. 따라서 foo의 저장 용량에 국한되지 않으므로 추가 저장 용량을 확보 할 수 있습니다. 당신은 당신이 더에 구둣 주걱 수없는 foofoo 스토리지로 변수를 할당하는 경우

, 즉

foo anyFoo; 
((bar*)(&anyFoo))->bar(); 

이 작동하지 않습니다.

관련 문제