개발중인 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:exception
와 std::runtime_error
이 문제에 기여은?
virtual
상속을 사용할 때 virtual
기본 생성자 호출은 중간 클래스의 책임이 아니라 가장 많이 파생 된 클래스의 책임입니다. 그 이유는 분명합니다. virtual
상속을 사용하면 실제로 기본 클래스를 사용하는 여러 파생 클래스가 있다는 기대가 있음을 나타냅니다. 이러한 파생 클래스 중 어떤 것이 virtual
기본 구성을 담당 합니까?
따라서 파생 클래스의 생성자는 virtual
기본에 인수를 제공해야합니다 . 예 :
IllegalArgumentException::IllegalArgumentException(std::string const& what)
: std::runtime_error(what)
, RuntimeException(what) {
}
중간베이스를 피하기 virtual
위해 virtual
상속을 위한베이스 클래스 의 생성자는 종종 기본 생성자를 제공합니다. 물론 가장 많이 파생 된 클래스가 해당 기반 중 하나에서 호출되는 적절한 생성자에 잘못 의존 할 가능성이 열립니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다