class A {
public:
void f() { cout << "A::f()" << endl; }
virtual void g() { cout << "A::g()" << endl; }
~A() { cout << "~A()" << endl; }
};
class B : public A {
public:
void f() { cout << "B::f()" << endl; }
virtual void g() { cout << "B::g()" << endl; }
~B() { cout << "~B()" << endl; }
};
int main() {
B *q = new B();
A *p = q;
}
1) main()의 끝에 다음 각 보기를 추가하였을 때, 실행 결과는 무엇이며 동적 바인딩이 발생하는 보기는 어느것인가?
① p->f(); ② p->g(); ③ q->f(); ④q->g();
답 : 2번
풀이 : p 가 업캐스팅 된 포인터인데 g() 함수를 호출하면 g 함수가 가상 함수이므로 동적 바인딩 된다.
2) main() 의 끝에 다음 각 코드를 별도로 실행한다면 실행 결과는 무엇인가?
delete p; delete q;
답 : ~A() / ~B() ~A()
3) 클래스 A의 소멸자에 virtual을 붙였을 때, delete p; 와 delete q; 의 실행 결과는?
답 : ~B() ~A() / ~B() ~A()
(1)
class Base {
virtual void run();
}
(2)
abstract class Base {
virtual void run();
}
(3)
class Base {
virtual void run() = 0;
}
(4)
abstract class Base {
virtual void run() = 0;
}
답 : 3번
1) Shape shape;
2) Shape *p;
3) Shape *p = new Shape();
4) class Circle : public Shape {
};
Circle circle;
답 : 2번