Java에서 C++로 상속

18387 단어 oopinheritancecppclass
이 글은 매우 짧을 것이다. 그러나 나는 그것이 사람들에게 매우 유용하다고 생각한다. 특히 자바에서 C++에 이르기까지.오늘 상속을 소개하고 싶은데, 이것은 작은 일로 보일 수도 있지만, 사실은 그렇지 않다.그것의 핵심은 아닐지도 모른다. 모든 자바 개발자들이 C++로 그것을 이해할 수 있다.나는 그것의 의미에 더욱 관심을 가지고 싶다.

범위 우선
이것은 매우 간단하기 때문에 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++속성 과정》이라는 책
  • CPP 참조 정보friend functions and objects

  • SO question 친구 기능을 언제 사용해야 하는가
  • 좋은 웹페이지 즐겨찾기