>백엔드 개발 >C++ >C에서 `std::string` 상속을 피해야 하는 이유는 무엇입니까?

C에서 `std::string` 상속을 피해야 하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-29 06:21:10858검색

Why Should I Avoid Inheriting from `std::string` in C  ?

std::string에서 상속할 때의 위험

상속을 사용하면 코드 재사용성을 제공할 수 있지만 클래스의 특정 요구 사항을 이해하는 것이 중요합니다. 기본 클래스로 작동합니다. Effective C에서 강조하는 중요한 고려 사항 중 하나는 클래스가 다형성으로 동작하려면 클래스에 가상 소멸자가 있어야 한다는 것입니다.

그러나 std::string에는 가상 소멸자가 없으므로 상속에 대한 우려가 있습니다. std::string에서 상속을 피하는 유일한 이유가 가상 소멸자의 부재인지에 대한 의문이 제기됩니다.

C에서 상속은 주로 두 가지 목적으로 사용됩니다.

  • 개인 상속: 다음을 사용하는 믹스인 및 측면 지향 프로그래밍의 경우 template.
  • 공개 상속: 특히 다형성 시나리오에 적합합니다.

비다형성 상속은 C에서 실질적인 가치가 없으므로 피할 수 있습니다. 무료 함수는 더 적합한 대안을 제공하므로 클라이언트가 사용자 정의 문자열 클래스로 강제 전환하지 않고도 클래스를 확장할 수 있습니다.

슬라이싱 문제

C에서 클래스는 다음과 같습니다. 다른 OO 언어의 참조 유형과 달리 값 유형. 이로 인해 전달된 값 개체가 기본 클래스 크기로 잘려 불일치가 발생하는 슬라이싱 문제가 발생합니다. 이는 아래 코드 조각에서 설명됩니다.

int StringToNumber(std::string copyMeByValue)
{
    // ... Your code to convert 'copyMeByValue' to a number.
}

std::string의 파생 개체를 이 함수에 전달하면 슬라이싱 문제가 발생하여 예기치 않은 동작이 발생합니다. 파생되지 않은 함수는 기본 클래스 멤버와 밀접하게 결합되어 있으므로 이러한 불일치가 발생할 수 있습니다.

결론

다형성 동작이 명시적으로 필요하지 않은 한 std::string에서 상속하지 마세요. . 코드 재사용을 위해 비멤버 함수와 상속용이 아닌 클래스의 멤버를 선호하세요. 이 관행을 준수하면 코드 유지 관리 가능성을 보장하고 상속 불일치와 관련된 잠재적인 문제를 방지할 수 있습니다.

위 내용은 C에서 `std::string` 상속을 피해야 하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.