기본 생성자가없는 가상베이스에서 클래스 파생

C. Finegan

개발중인 C ++ 응용 프로그램에 대한 예외 클래스의 작은 계층 구조를 작성 중이며 .NET에서 간접적으로 파생하는 데 문제가 있습니다 std::runtime_error. 지금까지 작성한 것과 유사한 코드는 다음과 같습니다.

class RuntimeException : public virtual boost::exception, public virtual std::runtime_error {
public:
    virtual ~RuntimeException() {}
    RuntimeException() : runtime_error("A RuntimeException occurred.") {}
    RuntimeException(const std::string& what) : runtime_error(what) {}
};

class IllegalArgumentException : public virtual RuntimeException {
public:
    IllegalArgumentException() : RuntimeException("An IllegalArgumentException occurred.") {}
    IllegalArgumentException(const std::string& what) : RuntimeException(what) {}
};

RuntimeException클래스는 문제없이 컴파일하지만 IllegalArgumentException오류를 생성 VS2015에서 컴파일을 거부 : no default constructor exists for class "std::runtime_error"모두 생성자에 대해 IllegalArgumentException. 이 코드가 잘 컴파일 될 것으로 예상 했으므로 C ++ 상속 계층 구조에 대한 이해가 어렵습니다.

내 이해는 기본 생성자가없는 것이 사실이지만 생성자가 .NET 용 생성자에 의해 호출 되기 때문에 컴파일 IllegalArgumentException 해야std::runtime_error 합니다 RuntimeException. 그러나 컴파일러가 거부하므로 분명히 이것은 거짓이어야합니다. std::runtime_error생성자에서 직접 생성자 를 호출하기를 원하는 것 같지만 IllegalArgumentException(그렇게하면 컴파일러 오류가 사라짐), 생성자를 std::runtime_error두 번 호출 할 것이기 때문에 잘못된 것 같습니다 . 한 번 생성자 RuntimeException에서, 생성자 IllegalArgumentException.

이것이 안전하고 효율적입니까? 그렇지 않다면 왜 컴파일러가 그것을 권장하는 것 같습니까? 나는 에서 불과을 도출 std::exception하고 구현하는 std::string멤버 변수로 자신을,하지만 난 이미 구현 한 표준 클래스에서 파생 쉬울 거라 생각 했어요. 이것이 잘못된 접근 방식입니까? 또한, 내가 모두에서 거의 유도하고있어 사실이다 boost:exceptionstd::runtime_error이 문제에 기여은?

Dietmar Kühl

virtual상속을 사용할 때 virtual기본 생성자 호출은 중간 클래스의 책임이 아니라 가장 많이 파생 된 클래스의 책임입니다. 그 이유는 분명합니다. virtual상속을 사용하면 실제로 기본 클래스를 사용하는 여러 파생 클래스가 있다는 기대가 있음을 나타냅니다. 이러한 파생 클래스 중 어떤 것이 virtual기본 구성을 담당 합니까?

따라서 파생 클래스의 생성자는 virtual기본에 인수를 제공해야합니다 . 예 :

IllegalArgumentException::IllegalArgumentException(std::string const& what)
    : std::runtime_error(what)
    , RuntimeException(what) {
}

중간베이스를 피하기 virtual위해 virtual상속을 위한베이스 클래스 의 생성자는 종종 기본 생성자를 제공합니다. 물론 가장 많이 파생 된 클래스가 해당 기반 중 하나에서 호출되는 적절한 생성자에 잘못 의존 할 가능성이 열립니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

클래스에 대한 기본 생성자가없는 오류

분류에서Dev

기본 생성자가없는 Java 클래스

분류에서Dev

파생 클래스 생성자에서 기본 클래스 생성자 호출

분류에서Dev

클래스에 대한 기본 생성자가 없습니다.

분류에서Dev

기본 클래스 생성자에서 파생 클래스 속성 사용

분류에서Dev

파생 클래스 생성자에서 기본 멤버 설정

분류에서Dev

부모 클래스에 C ++의 기본 생성자가없는 경우 상속 된 클래스에서 생성자를 어떻게 사용합니까?

분류에서Dev

암시 적 파생 클래스 생성자가 기본 클래스 생성자를 호출하도록 허용

분류에서Dev

파생 클래스를 선언하는 동안 기본 클래스의 생성자가 호출됩니다.

분류에서Dev

기본 생성자가없는 추상 클래스의 Decorator 클래스를 어떻게 구현합니까?

분류에서Dev

클래스가 unique_ptr에서 파생되는 경우 기본 생성자를 호출하는 방법

분류에서Dev

C ++에서 기본 및 파생 클래스에 대한 '가상'생성자를 선언 하시겠습니까?

분류에서Dev

방법 : 적절한 기본 생성자없이 클래스의 인스턴스 복사 기본 생성자가없는 멤버가 있습니까?

분류에서Dev

기본 클래스에서 파생 클래스 유형 식별

분류에서Dev

기본 클래스에서 파생 클래스 값 수정

분류에서Dev

기본 클래스에서 파생 클래스 개체 사용

분류에서Dev

기본 및 파생 클래스의 생성자

분류에서Dev

상속의 기본 클래스가 파생 클래스에 복사됩니까?

분류에서Dev

기본 및 파생 클래스 C ++ 11

분류에서Dev

상속-기본 클래스 생성자를 인스턴스화하는 데 필요한 파생 클래스

분류에서Dev

파생 클래스에서 전용 멤버에 액세스 할 수 없습니다 (생성자가 기본 클래스에 정의되어 있어도)

분류에서Dev

파생 클래스 생성자에서 예외가 발생합니다. 기본 클래스 소멸자가 호출되지만 파생 클래스 소멸자가 아닌 이유는 무엇입니까?

분류에서Dev

생성자 및 가상 기본 클래스 상속

분류에서Dev

생성자가없는 파생 클래스의 메서드

분류에서Dev

기본 클래스 생성자에서 인스턴스화 된 파생 클래스 파악

분류에서Dev

가상 기본 클래스 함수의 파생 클래스 크기

분류에서Dev

기존 파생 클래스의 기본 클래스 변경

분류에서Dev

파생 클래스로 기본 클래스 변수 초기화

분류에서Dev

기본 생성자에서 가상 클래스 멤버 함수 바인딩

Related 관련 기사

  1. 1

    클래스에 대한 기본 생성자가없는 오류

  2. 2

    기본 생성자가없는 Java 클래스

  3. 3

    파생 클래스 생성자에서 기본 클래스 생성자 호출

  4. 4

    클래스에 대한 기본 생성자가 없습니다.

  5. 5

    기본 클래스 생성자에서 파생 클래스 속성 사용

  6. 6

    파생 클래스 생성자에서 기본 멤버 설정

  7. 7

    부모 클래스에 C ++의 기본 생성자가없는 경우 상속 된 클래스에서 생성자를 어떻게 사용합니까?

  8. 8

    암시 적 파생 클래스 생성자가 기본 클래스 생성자를 호출하도록 허용

  9. 9

    파생 클래스를 선언하는 동안 기본 클래스의 생성자가 호출됩니다.

  10. 10

    기본 생성자가없는 추상 클래스의 Decorator 클래스를 어떻게 구현합니까?

  11. 11

    클래스가 unique_ptr에서 파생되는 경우 기본 생성자를 호출하는 방법

  12. 12

    C ++에서 기본 및 파생 클래스에 대한 '가상'생성자를 선언 하시겠습니까?

  13. 13

    방법 : 적절한 기본 생성자없이 클래스의 인스턴스 복사 기본 생성자가없는 멤버가 있습니까?

  14. 14

    기본 클래스에서 파생 클래스 유형 식별

  15. 15

    기본 클래스에서 파생 클래스 값 수정

  16. 16

    기본 클래스에서 파생 클래스 개체 사용

  17. 17

    기본 및 파생 클래스의 생성자

  18. 18

    상속의 기본 클래스가 파생 클래스에 복사됩니까?

  19. 19

    기본 및 파생 클래스 C ++ 11

  20. 20

    상속-기본 클래스 생성자를 인스턴스화하는 데 필요한 파생 클래스

  21. 21

    파생 클래스에서 전용 멤버에 액세스 할 수 없습니다 (생성자가 기본 클래스에 정의되어 있어도)

  22. 22

    파생 클래스 생성자에서 예외가 발생합니다. 기본 클래스 소멸자가 호출되지만 파생 클래스 소멸자가 아닌 이유는 무엇입니까?

  23. 23

    생성자 및 가상 기본 클래스 상속

  24. 24

    생성자가없는 파생 클래스의 메서드

  25. 25

    기본 클래스 생성자에서 인스턴스화 된 파생 클래스 파악

  26. 26

    가상 기본 클래스 함수의 파생 클래스 크기

  27. 27

    기존 파생 클래스의 기본 클래스 변경

  28. 28

    파생 클래스로 기본 클래스 변수 초기화

  29. 29

    기본 생성자에서 가상 클래스 멤버 함수 바인딩

뜨겁다태그

보관