기본 클래스는 더 많은 특수 클래스를 추상화 한 것입니다. 결과적으로 기지는 그것으로부터 파생 된 사람들에 대해 아무것도 모르고, 알 필요가 없다. 모든 클래스가 알고있는 것은 그 자체이며 클래스가 사용할 수있는 클래스가 무엇인지 알고 있습니다.
또한 C++ 빌드 프로세스로 향후 자식 클래스의 모든 가능한 순열을 알 수 없습니다. 아직 작성되지 않았거나 나중에 또는 런타임에 링크 될 수도 있고 연결되지 않을 수도있는 다른 모듈에있을 수도있는 코드를 알아야합니다.
대부분의 시간 동안 하위 클래스를 통해 기본 클래스의 멤버를 조작하려면 아무 것도 할 필요가 없습니다. public
및 protected
변수의 경우 하위 클래스에서 기본 클래스의 내용에 액세스 할 수 있습니다. private
데이터는 평소와 같이 제한이 없습니다 (단, friend
발송 함). 기본 클래스는 대부분의 경우 일을 할 것 int x
x = 24;
있다
합니다.
이것은 기본 이름과 서브 클래스 모두에 동일한 이름의 변수가있는 경우에만 문제가됩니다. 일부 코드에 대한
시간 :
#include <iostream>
struct object // using struct because it defaults to public access.
// This makes for a simpler example
{
int x;
int y;
};
struct robot:public object
{
int x; // variable hides the x in object
int y;
void print()
{
std::cout << "robot: " << x << ',' << object::x << '\n';
// to access object's x we must ask for it explicitly
}
};
struct betterrobot:public object
{
void print()
{
std::cout << "better robot: " << x << ',' << object::x << '\n';
}
};
int main() {
robot rob;
rob.x = 24; // set robot's x
rob.object::x = 42; // set object's x
rob.print();
betterrobot rob2;
rob2.x = 24;
rob2.print();
return 0;
}
출력 :
로봇 : 24,42
더 나은 로봇 : 24, 24
Object
및 robot
가지고 자신의 자신의 x
및 y
. object
의 x
명시 x
및 object::x
다른 답을 주었다 인쇄 출력에 그것을
rob.object::x = 42;
요청하여 robot
통해 도달 할 수있다.그것은 robot::print
방법을보고으로 만
rob.x = 24;
스마트 컴파일러는 즉시 object::x
를 초기화하지 않는 당신 비명됩니다. 그렇지 않다면, 행복한 디버깅!
이것은 두뇌에 혼란을 야기하기 때문에 드물게하고 싶은 것입니다. 당신은 두 개의 x
을 가지고 있고 polymprphic 객체 (Note : 일을 간단하게하기 위해 예제에서 다형성 객체가 없다)로 작업 할 때 정말 망쳐 놓고 틀린 것을 설정한다. x
. 그것을 피할 방법이 없다면 이것을하지 마십시오.
혼동을 피하기 위해 기본 클래스의 변수를 상속하고 사용하는 것이 거의 항상 좋습니다. 이것은 betterrobot
입니다. betterrobot
은 object
의 x
및 y
만 있습니다. 혼동 할 가능성은 없습니다.
rob2.x = 24;
모두 있습니다. 산출물에서, x
과 object::x
을 인쇄하면 같은 대답을 얻을 수 있습니다.
다른 object
처럼 betterrobot
을 이동할 수 있습니다. object
, move
의 기능은 예를 들어 betterrobot
을지도에서 움직일 수 있습니다. 특별한 마법은 필요하지 않습니다.
게시물을 편집하여'objects' 및'robot' 클래스의 내용을 포함하십시오. –
'로봇'이 '객체'에서 파생되고 '객체'만이 'x'와 'y'를 갖는 경우 '로봇'은 'x'와 'y'인스턴스를 한 번만 갖습니다. 제목 질문에 대답하려면 - 그것은하지 않습니다 – Fureeish
기지는 그것에서 파생 된 것들에 대해 아무것도 모릅니다. 비인과적인 행동에 대해 생각해보십시오. – user4581301