정적 멤버가 상속되면 전체 계층 구조 또는 해당 클래스에 대해 정적입니다. 즉 :
class SomeClass
{
public:
SomeClass(){total++;}
static int total;
};
class SomeDerivedClass: public SomeClass
{
public:
SomeDerivedClass(){total++;}
};
int main()
{
SomeClass A;
SomeClass B;
SomeDerivedClass C;
return 0;
}
세 가지 경우에 3 일 총 것, 또는 2 것 SomeClass
과 일을 SomeDerivedClass
?
답변
3 모든 경우에 static int total
상속 된는 고유 변수가 아니라 SomeDerivedClass
에서 정확히 하나 SomeClass
이기 때문입니다.
편집 : @ejames가 그의 대답에서 발견하고 지적했듯이 모든 경우에 실제로 4 입니다.
편집 : 두 번째 질문의 코드는 int
두 경우 모두 누락 되었지만 추가하면 괜찮습니다.
class A
{
public:
static int MaxHP;
};
int A::MaxHP = 23;
class Cat: A
{
public:
static const int MaxHP = 100;
};
A :: MaxHP 및 Cat :: MaxHP에 대해 서로 다른 값을 사용하여 잘 작동합니다.이 경우 하위 클래스는 기본 클래스에서 정적을 “상속하지”않습니다. 하나.
답변
의 구성으로 인해 합계가 두 번 증가하기 때문에 답은 실제로 모든 경우에 4 입니다 .SomeDerivedClass
다음은 완전한 프로그램입니다 (내 대답을 확인하는 데 사용) :
#include <iostream>
#include <string>
using namespace std;
class SomeClass
{
public:
SomeClass() {total++;}
static int total;
void Print(string n) { cout << n << ".total = " << total << endl; }
};
int SomeClass::total = 0;
class SomeDerivedClass: public SomeClass
{
public:
SomeDerivedClass() {total++;}
};
int main(int argc, char ** argv)
{
SomeClass A;
SomeClass B;
SomeDerivedClass C;
A.Print("A");
B.Print("B");
C.Print("C");
return 0;
}
결과 :
A.total = 4
B.total = 4
C.total = 4
답변
파생 객체가 생성 될 때 파생 클래스 생성자가 기본 클래스 생성자를 호출하기 때문에 4입니다.
따라서 정적 변수의 값은 두 번 증가합니다.
답변
#include<iostream>
using namespace std;
class A
{
public:
A(){total++; cout << "A() total = "<< total << endl;}
static int total;
};
int A::total = 0;
class B: public A
{
public:
B(){total++; cout << "B() total = " << total << endl;}
};
int main()
{
A a1;
A a2;
B b1;
return 0;
}
다음과 같습니다.
A() total = 1
A() total = 2
A() total = 3
B() total = 4
답변
SomeClass () 생성자는 SomeDerivedClass ()가 호출 될 때 자동으로 호출됩니다. 이것은 C ++ 규칙입니다. 이것이 합계가 각 SomeClass 객체마다 한 번씩 증가한 다음 SomeDerivedClass 객체에 대해 두 번 증가하는 이유입니다. 2×1 + 2 = 4
답변
세 가지 경우 모두 3입니다.
그리고 다른 질문에 대해서는 정적 대신 const 변수가 정말로 필요한 것 같습니다. 파생 클래스에서 재정의 된 필요한 변수를 반환하는 가상 함수를 제공하는 것이 더 자명 할 수 있습니다.
성능이 필요한 중요한 경로에서이 코드가 호출되지 않는 한 항상 더 직관적 인 코드를 선택하십시오.
답변
예, 파생 클래스는 동일한 정적 변수를 포함합니다. 즉, 모두 합계에 대해 3을 포함합니다 (총계가 어딘가에 0으로 초기화되었다고 가정).