문제

세 가지 기본 클래스가 있습니다.

class BaseA
{
public:
    virtual int foo() = 0;
};

class BaseB
{
public:
    virtual int foo() { return 42; }
};

class BaseC
{
public:
    int foo() { return 42; }
};

그런 다음 이와 같이베이스에서 파생됩니다 (A, B 또는 C의 대체 x) :

class Child : public BaseX
{
public:
    int foo() { return 42; }
};

세 가지 다른 기본 클래스에서 기능이 어떻게 무시됩니까? 내 세 가지 가정이 맞습니까? 다른 경고가 있습니까?

  • Basea를 사용하면 어린이 수업이 컴파일되지 않으며 순수한 가상 기능은 정의되지 않습니다.
  • Baseb의 경우, Baseb* 또는 Child*에서 foo를 호출 할 때 어린이의 기능이 호출됩니다.
  • Basec을 사용하면 어린이의 Foo를 호출 할 때 어린이의 기능이 호출되지만 Baseb* (부모 클래스의 기능이 호출됨).
도움이 되었습니까?

해결책

파생 클래스 A 메소드에서 키워드 가상이 파생 클래스 메소드에서 사용되지 않더라도 기본 클래스에서 가상으로 정의 된 경우 가상입니다.

  • 와 함께 BaseA, 그것은 의도 한대로 컴파일하고 실행됩니다. foo() 가상이되고 수업에서 실행됩니다 Child.
  • 와 같다 BaseB, 또한 의도 한대로 컴파일하고 실행됩니다. foo() 가상 ()이고 수업 시간에 실행됩니다 Child.
  • 와 함께 BaseC 그러나 컴파일하고 실행되지만 실행됩니다. BaseC 컨텍스트에서 호출하는 경우 버전 BaseC, 그리고 Child 컨텍스트로 호출하는 경우 버전 Child.

다른 팁

기억해야 할 중요한 규칙은 일단 함수가 가상으로 선언되면 파생 클래스의 서명과 일치하는 기능은 항상 가상입니다. 따라서 A와 B의 자녀의 자녀에게는 무시됩니다.

그러나 C를 사용하면 기능이 재정의되지 않지만 과부하가 발생합니다. 이러한 상황에서는 정적 유형 만 중요합니다. 그것은 객체가 실제로있는 대신 (정적 유형) (정적 유형)에 대한 포인터를 부릅니다 (동적 유형).

Basea를 사용하면 어린이 수업이 컴파일되지 않으며 순수한 가상 기능은 정의되지 않습니다.

이것은 Basea의 대상을 만들려고하는 경우에만 해당됩니다. 아이의 대상을 만들고 Basea* 또는 child*를 사용하여 foo ()에게 전화 할 수 있습니다*

Baseb의 경우, Baseb* 또는 Child*에서 foo를 호출 할 때 어린이의 기능이 호출됩니다.

물체가 baseb 또는 child 일 수 있으므로 물체의 유형에 따라 다릅니다. 객체가 baseb 인 경우 baseb :: foo가 호출됩니다.

Basec을 사용하면 어린이의 Foo를 호출 할 때 어린이의 기능이 호출되지만 Baseb* (부모 클래스의 함수는 호출)입니다.

예,하지만 당신은 이것을하고 싶지 않습니다.

다형성 관점에서 A를 선호하므로 각 어린이가 자신의 가상 기능을 구현하고 있음을 알고 있습니다.
유효한 기본 구현이있는 경우 B 주로 B를 선택하지만 모든 어린이 계급에 필요에 따라 자체 구현이 있는지 확인해야합니다. C는 다형성이 아니므로 신중하게 사용하십시오.

그것은 주로 당신이 그것을 부르는 방법에 달려 있습니다.

당신이했다면 :

class Child : public BaseA
{
public:
    int foo() { return 42; }
};

그리고 그랬습니다

BaseA baseA = new Child();
baseA->foo();

Child 's Foo 기능이라고합니다.

그러나, 당신이 이것을했다면 :

BaseA baseA = new BaseA();

컴파일 시간 오류가 발생합니다.

수업 어린이 ~ 할 것이다 A에서 파생 된 경우 컴파일하면 해당 유형의 개체를 인스턴스화 할 수 없습니다.

기본에서 일부 기능을 무시하고 다시 파생하려는 경우 가치가있을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top