나는 항상 기본 클래스 생성자/소멸자/친구가 파생 클래스에 상속되지 않는다고 생각 해왔다. 이 링크는 다음을 확인합니다 : http://www.geeksforgeeks.org/g-fact-4/.파생 클래스에 상속되는 기본 생성자?
파생 클래스 이니셜 라이저 목록의 초기화 목록에 기본 클래스 생성자를 작성할 수 있다는 것도 알고있었습니다.
다음과 같이 말하면서 : 나는 그것에 대해 오늘 나의 능력을 검사하려고 노력했다. 그러나 나는이 프로그램의 결과물을 추측하지 못했다.
#include<iostream>
class A {
int x, y;
public:
A(int a = 0, int b = 0) : x(a), y(b) {
std::cout << "A ctor called" << std::endl;
}
void print_A() {
std::cout << "x = " << x << std::endl;
std::cout << "y = " << y << std::endl;
}
};
class B : public A {
int z;
public:
// I knew that A member can be initilized like this.
B(int a = 0, int b = 0, int c = 0) : z(a), A(b, c) {
std::cout << "C ctor called" << std::endl;
// I was not aware about that.
A(b, c);
}
void print_B() {
std::cout << "z = " << z << std::endl;
}
};
int main() {
B b(1, 2, 3);
b.print_A();
b.print_B();
}
출력 : 질문의
A ctor called
C ctor called
A ctor called
x = 2
y = 3
z = 1
커플 :
클래스 'B'를 할 수있는 생성자에 액세스 할 수있는 방법 생성자/desctructors/친구가 기지에서 상속하지 않는 경우, 여기서 'A'클래스의.
어떻게 출력 되나요? A의 두 생성자가 어떻게 호출 되었습니까?
하지만 왜 그것은 생성자 호출과 같습니다. 임시 객체를 만드는 이유는 무엇입니까? –
개체 생성 _does_ 생성자를 호출합니다. 그것이 개체가 생성 된 이유입니다. 그리고'A (b, c)'는 새로운 객체에 이름을 부여하지 않았다는 것을 제외하고는'A (b, c) '와 같습니다. 새로 할당 된 메모리에있는 객체도 생성하는'new A (b, c)'표현식을 비교하십시오 (이 경우 결과로 생성되는'A *'포인터는 일반적으로 명명 된 변수에 저장되지만 객체 자체에는 이름). – Useless