Java에서 C++로 상속
18387 단어 oopinheritancecppclass
범위 우선
이것은 매우 간단하기 때문에 C++의 역할 영역부터 시작합시다.C++에서, 우리는 단지 세 개의 역할 영역만 가지고 있으며, 우리는 이미 (자바에서 온) 공공, 보호, 사유를 알고 있다.그건 이상하지 않아요.공공은 공공을 의미하고 보호받는 것은 보호받는 것이다. 특정 계층의 아이들만이 이런 구성원을 접할 수 있다.마지막으로 클래스 내부에서만 구성원을 방문할 수 있는 개인 수식자가 하나 더 있다.지금까지 모든 것이 명백하다.
코드에 쓴 것이 언급되었을 때 문제가 발생했다.자바에서, 우리는 클래스 앞에서 접근 수식자를 사용할 뿐만 아니라, 모든 방법에 그것들을 지정합니다. (인터페이스의 기본 공공 수식자를 생략했으니, 신경 쓰지 마십시오.)C++에서는 다음과 같이 역할 영역 섹션에서 클래스 멤버를 그룹화합니다.
class MyClass
{
public:
int someMethod();
protected:
int someOtherMethod();
private:
int x, y;
}
그들의 순서는 결코 중요하지 않다. 더 중요한 것은 그들이 몇 명 있을 수 있다는 것이다.다음 과정은 매우 좋다.class MyClass
{
public:
int someMethod();
protected:
int someOtherMethod();
private:
int x, y;
public:
int someMethod2();
private:
int z;
}
이상해 보이죠?솔직히 말하자면, 나는 아직 을 읽지 못했지만, 나는 한 종류에서 단작용역 부분만 사용할 수 있는 기교가 있기를 바란다.자, 계속합시다.상속권
역할 영역 상속
우리가 하나의 클래스에서 계승할 때, 반드시 연산자를 사용하여 표시해야 한다.또한, 하위 구성원의 가시성을 결정하는 방문 수식자를 지정할 수 있습니다.인프라는 다음과 같습니다.
class Parent {};
class Child : ACCESS-MODIFIER Parent {};
ACCESS-MODIFIER의 위치에서, 우리는 이미 알고 있는 수식자인public, 보호된,private를 놓을 수 있습니다.수정자가 지정되지 않았을 때 기본값은private입니다!사용한 수식자를 바탕으로 계승된 클래스 구성원은 다음과 같은 방문 수식자를 가지고 있다.방법 유전
C++는 대상 언어이기 때문에 분명히 방법을 계승해야 하는 행위입니다. 그렇습니까?그러나 Java와 다르게 작동합니다.예를 살펴보겠습니다.
class Parent {
public void someMethod() {
System.out.println("Parent");
}
}
class Child extends Parent {
public void someMethod() {
System.out.println("Child");
}
}
public static void main(String []args) {
Parent p = new Parent();
Child c = new Child();
Parent referenceToChildUsingParent = c;
p.someMethod();
c.someMethod();
referenceToChildUsingParent.someMethod();
}
코드는 가능한 한 간단하다.만약 부류에 방법이 있고, 우리가 부류의 작용역을 제한하지 않는다면, 부류를 계승하고 다시 쓰는 것은 문제없다.산출은:Parent
Child
Child
C++와는 다릅니다.위의 Java 코드와 동일한 코드는 다음과 같습니다.#include<iostream>
class Parent {
public:
void say() {
std::cout << "Parent says hi!" << "\n";
}
};
class Child : public Parent {
public:
void say() {
std::cout << "Child says hi!" << "\n";
}
};
int main()
{
Parent parent;
Child child;
Parent& referenceToChildUsingParent = child;
parent.say();
child.say();
referenceToChildUsingParent.say();
}
너는 출력을 알아맞힐 수 있니?이것은 다음과 같습니다.Parent says hi!
Child says hi!
Parent says hi! // Yes, that's not a mistake!
기본적으로 다른 수식자를 지정하지 않았을 때 인용하는 형식은 'wins' 입니다.자바와 같은 결과를 얻기 위해서, 파생 클래스 방법이 존재한다면, 자바를 사용하길 희망한다는 것을 컴파일러에게 알려야 합니다.다음은 코드입니다.#include<iostream>
class Parent {
public:
virtual void say() { // Notice the usage of VIRTUAL here
std::cout << "Parent says hi!" << "\n";
}
};
class Child : public Parent {
public:
void say() {
std::cout << "Child says hi!" << "\n";
}
};
int main()
{
Parent parent;
Child child;
Parent& referenceToChildUsingParent = child;
parent.say();
child.say();
referenceToChildUsingParent.say();
}
현재 출력은 동일합니다.가상 작업은 자바의 기본 수식자 - 부모 레벨에 존재하는 방법의 현재 구현과 유사하며 기본적으로 사용됩니다.그러나 하위 클래스에서 어떤 방법을 다시 썼다면 이 방법을 사용할 것이다.하위 클래스에서 오버라이드 키워드를 사용하면 가상 사용을 강화할 수 있습니다.이러한 동작은 Java의 @Override 주석과 유사하며 메서드가 상속됨을 나타냅니다.다시 쓰기를 사용하고 부모 클래스에 일치하는 방법이 없으면 컴파일러가 실패합니다.class Parent {};
class Child : public Parent {
public:
void say() override { // This line will cause compilation error
std::cout << "Child says hi!" << "\n";
}
};
자바에서 기본 키워드 (자바8에 도입되고 인터페이스에만 적용) 를 제외하고는 오래된 추상적인 수식자도 있습니다.일깨워 주십시오. 추상적인 클래스로 성명하는 방법은 실례화할 수 없습니다.비록 문법이 다르지만, 이것은 C++에도 적용된다.더 중요한 것은 이러한 유형의 방법(하위 대상에서 구체적으로 실현되어야 함)을 순수한 가상 방법/함수라고 부른다.어디 보자.#include<iostream>
class Parent {
public:
virtual void say() =0; // =0 is an equivalent of 'abstract'
};
class Child : public Parent {
public:
void say() override {
std::cout << "Child says hi!" << "\n";
}
};
int main()
{
// Parent parent; This line will cause compilation error when uncommented
Child child;
Parent& referenceToChildUsingParent = child;
child.say();
referenceToChildUsingParent.say();
}
이런 문법을 사용하면 실제로 C++에서 인터페이스 기능을 실현할 수 있다. 비록 이러한 개념이 없지만 (자바 언어가 지원한다).모든 종류의 방법을 순수한 방법으로 성명하기만 하면, 그것은 가장 선진적인 인터페이스이다.여기서 중요한 것을 언급해야 한다. 이것은 자원 유출을 방지할 수 있는 좋은 실천이다. 시종일관 기류/인터페이스에서 가상 분석 함수를 실현할 수 있다.충분하다
keyword for that - indicating that we let compiler generate the body of this method automatically.
```cpp
class Parent {
public:
virtual void say() =0;
virtual ~Parent() =default;
};
네, 제 클래스 방문 수식자는 어디에 있습니까?
사실은 없어요.이것은 정확하다.클래스 접근 수식자 개념이 없습니다.모든 것은 반에서 결정한다
구성원 등급에 대해 우리는 이것에 대해 아무런 힘이 없다.자바 세계에서 온 것은 거대한 제한인 것 같다.그러나 C++20에 도입된 C++ 모듈의 개념이 여기에 도움이 되는 것 같지만, 나는 아직 깊이 토론하고 싶지 않다.나는 장래에 그것에 관한 단독 댓글을 한 편 쓸 계획이다.
친구 기능
"친구랑 얘기하고 들어가"가 내 머릿속에 떠올랐지?다시 한 번--나는 놀랍게도 C++에서 이 개념을 발견했다.비록 사실은 그렇지 않지만, 그것은 자바의 패키지 개인 수식자와 거의 비슷하다.요컨대, 우원 함수는 실제적으로 클래스의 구성원이 아닌 사유와 보호 요소에 접근할 수 있다.워터?네, 잘 읽었어요.아래의 코드는 이 개념에 대해 깨우침을 주어야 한다. 비록 이 기능은 아래의 예시 (공식 CPP 참조) 보다 훨씬 복잡하지만.
class Y {
int data; // private member
// the non-member function operator<< will have access to Y's private members
friend std::ostream& operator<<(std::ostream& out, const Y& o);
friend char* X::foo(int); // members of other classes can be friends too
friend X::X(char), X::~X(); // constructors and destructors can be friends
};
// friend declaration does not declare a member function
// this operator<< still needs to be defined, as a non-member
std::ostream& operator<<(std::ostream& out, const Y& y)
{
return out << y.data; // can access private member Y::data
}
자료 출처:조시 로스피노소의 《C++속성 과정》이라는 책
SO question 친구 기능을 언제 사용해야 하는가
Reference
이 문제에 관하여(Java에서 C++로 상속), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/chlebik/from-java-to-c-inheritance-305j텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)