다형 함수를 선언 할 때는 가상 클래스 함수를 선언해야한다는 것을 알고 있습니다.상속 클래스의 C++ 가상 함수
class Base
{
public:
virtual void f();
};
내 질문 당신이 그것을 "봉인"하는 것처럼 아동의 동작 것으로 예상 될지라도, 가상으로 상속 클래스의 함수를 선언해야한다?
class Child : public Base
{
public:
void f();
};
다형 함수를 선언 할 때는 가상 클래스 함수를 선언해야한다는 것을 알고 있습니다.상속 클래스의 C++ 가상 함수
class Base
{
public:
virtual void f();
};
내 질문 당신이 그것을 "봉인"하는 것처럼 아동의 동작 것으로 예상 될지라도, 가상으로 상속 클래스의 함수를 선언해야한다?
class Child : public Base
{
public:
void f();
};
아니요, 가상 함수를 다시 선언 할 필요가 없습니다.
기본 클래스에서 virtual
기능이 자동으로 가상 모든 재정의 함수를 선언합니다 :
struct A
{
void foo(); //not virtual
};
struct B : A
{
virtual void foo(); //virtual
}
struct C : B
{
void foo(); //virtual
}
C가 B를 상속 받도록 예제를 다시 편집하십시오. –
@Kevin 고맙습니다. 또한 A.의 B –
선언 F()를 아동 가상으로는 아동의 정의를 읽는 몇 가지 일을하는 데 도움이됩니다. 문서로 유용합니다.
기본 클래스 덮어 쓰기가 virtual
으로 표시되면 다른 모든 재정의는 암시 적으로 그렇게됩니다. 기능을 virtual
으로 표시 할 필요는 없지만 문서화를 위해이 기능을 사용하는 경향이 있습니다.
마지막 부분 : 자녀가 마치 "봉인 된"것처럼 행동한다고해도?
template <typename T>
class seal {
seal() {}
friend T;
};
: 당신이 실 클래스에 원하는 경우는, 당신은 클래스 그래서 같은
실을 작성하여 (이 C++ 03 일반적으로 완전히 구현 가능한 아니었다) C++ 11에서 그것을 실제로 수 그리고는 (CRTP) 그것에서 봉인 클래스를 상속 :
class Child : public Base, virtual seal<Child> {
// ...
};
트릭 때문에 가상 상속의 사용의 계층 구조에서 가장 파생 형이 경우하는 int (가상 기본 생성자를 호출해야한다는 것입니다 seal<Child>
), 그 생성자는 p 템플리트 클래스에서 rivate하고 선언을 통해 Child
에만 사용할 수 있습니다.
seal
유형을 생성하거나 것 C++에서 (가 무단으로 변경 될 수 있습니다)
' 나는 자식이 상속 될 수 있고 f()가 차례로 재정의 된 가상이 필요하다는 것을 안다. 그것은 단지 명백한 잘못이다. 그는 기본 클래스의 함수가 가상이므로 모든 상속 함수는 가상으로 함축되어 있습니다. 따라서 '가상'을 다시 사용할 필요가 없습니다. 절대로. – Jasper