1. 호출하는 함수의 결정을 실행 시간에 하도록 컴파일러에게 지시하는 키워드는?
1) virtual 2) static 3) public 4) extern
답 : 1번
2. 기본 클래스의 가상 함수와 동일한 타입의 함수를 파생 클래스에서 작성하는 것을 무엇이라고 하는가?
1) overloading 2) overriding 3) virtual 4) dynamic binding
답 : 2번 오버라이딩이라고 한다.
3. 다음 중 의미가 다른 하나는?
1) dynamic binding 2) late binding 3) compile-time binding 4) run-time binding
답 : 3번 풀이 : 다른 것들은 동적 바인딩에 대한 설명인데 3번은 정적 바인딩에 대한 설명이다
4. 오버로딩, 오버라이딩, 연산자 중복 등은 C++ 언어의 어떤 객체 지향 특성인가?
답 : 다형성
5. 다음 코드에 대해 물음에 답하여라.
class Base {
public:
void func() { f(); }
void f() { cout << "Base::f() called" << endl; }
};
class Derived : public Base {
public:
void f() { cout << "Derived::f() called" << endl; }
};
1) 기본 클래스와 파생 클래스는 무엇인가?
답 : 기본 클래스 - Base 클래스, 파생 클래스 - Derived 클래스
2) 다음 코드가 실행될 때 화면에 출력되는 내용은?
Derived der;
der.f(); // (2)
Base base;
Base* p = &base;
p->f(); // (3)
p = &der;
p->f(); // (4)
p->func(); // (5)
6. 다음 코드에 대해 물음에 답하여라.
class A {
public:
void func() { f(); }
virtual void f() { cout << "A::f() called" << endl; }
};
class B : public A {
public:
void f() { cout << "B::f() called" << endl; }
};
class C : public B {
public:
void f() { cout << "C::f() called" << endl; }
};
1) 다음 함수 중 가상 함수를 모두 골라라.
(1) A의 f() (2) B의 f() (3) C의 f() (4) A의 func()
2) 다음 코드가 실행될 때 출력되는 결과는 무엇인가?
C c;
c.f(); // (2)
A* pa;
B* pb;
pa = pb = &c;
pb->f(); // (3)
pa->f(); // (4)
pa->func(); // (5)
7. 다음 빈칸에 적절한 단어를 보기에서 골라 삽입하라
동일한 이름의 변수나 함수가 여러 곳에 선언되었을 때, 가장 범위에 선언된 이름을 사용하는 규칙을 컴퓨터 언어 이론에서 (이)라고 한다. _(을)를 사용하면 클래스 멤버와 동일한 이름의 외부 함수를 클래스 내에서 호출할 수 있다.
답 : 가까운, 범위 규칙, 범위 지정 연산자
8. 각 문항에 따라 함수 g()의 빈칸에 적절한 코드는?
void f() {
cout << "f() called" << endl;
}
class A {
public:
virtual void f() { cout << "A::f() called" << endl; }
};
class B : public A {
public:
void g() { ______ }
void f() { cout << "B::f() called" << endl; }
};
1) 함수 g()가 외부 함수 f()를 호출한다.
답 - ::f();
2) 함수 g()가 클래스 A의 멤버 함수 f()를 호출한다.
답 - A::f();
3) 함수 g()가 자신의 멤버 함수 f()를 호출한다.
답 - this->f();
9. 생성자와 소멸자를 가상 함수로 선언하는 것에 대한 설명 중 맞는 것은?
1) 소멸자는 동적 바인딩 되지 않는다.
2) 소멸자를 가상 함수로 선언하는 것이 바람직하다.
3) 소멸자를 가상 함수로 선언해도 동적 바인딩이 일어나지 않는다.
4) 생성자를 가상 함수로 선언하는 것이 바람직하다.
답 : 2번
10. 다음은 Person 클랫와 파생 클래스 Student를 작성한 사례이다.
class Person {
int id;
public:
Person(int id = 0) { this->id = id; }
~Person() { cout << "id=" << id << endl; }
};
class Student : public Person {
char* name;
public:
Student(int id, const char* name) : Person(id) {
int len = strlen(name);
this->name = new char[len + 1];
strcpy(this->name, name);
}
~Student() {
cout << "name=" << name << endl;
delete[] name;
}
};
int main() {
Person* p = new Student(10, "손연재");
delete p;
}
1) 다음 코드의 실행 결과는 무엇인가? 실행 결과에 대해 어떤 문제가 있다고 생각되는가?
답 : id=10
2) Person 클래스나 Student 클래스를 수정하여 문제점을 해결하라.
답 : ~Person() 과 ~Student() 앞에 virtual을 추가한다.
11. 다음 중 순수 가상 함수는?
class Shape {
public:
void draw() = 0; // 1
virtual void draw(); //2
virtual void draw() = 0; //3
virtual void draw() {} // 4
};
답 : 3번
12. 순수 가상 함수에 대해 잘못 말한 것은?
1) 순수 가상 함수를 가진 클래스는 무조건 추상 클래스이다.
2) 순수 가상 함수는 실행이 목적이 아니라, 파생 클래스가 구현해야 할 함수를 알려주기 위한 것이다.
3) 외부 함수도 순수 가상 함수로 선언 가능하다.
4) 순수 가상 함수가 호출되면 동적 바인딩이 일어난다.
답 : 3번, 외부함수는 해당되지 않는다.
13. 다음에서 추상 클래스는?
1)
class Shape {
void draw() = 0;
};
2)
class Shape {
virtual void draw() = 0;
};
3)
class Shape {
void void draw() {} = 0;
};
4)
abstract class Shape {
virtual void draw() = 0;
};
답 : 2번
14. 다음 코드에 대해 물음에 답하여라.
class Shape {
public:
void paint() { draw(); }
virtual void draw() = 0;
};
class Circle :public Shape {
int radius;
public:
Circle(int radius = 1) { this->radius = radius; }
double getArea() { return 3.14 * radius * radius; }
};
1) 다음 중 오류가 발생하는 것을 있는 대로 골라라.
2) 다음 코드의 실행 결과 "반지름=10인 원"이 출력되도록 Shape이나 Circle 클래스를 수정하라.
Circle *p = new Circle(10);
p->paint();
반지름=10인 원
답 :
class Shape {
public:
void paint() { draw(); }
virtual void draw() = 0;
};
class Circle :public Shape {
int radius;
public:
Circle(int radius = 1) { this->radius = radius; }
double getArea() { return 3.14 * radius * radius; }
void draw() {
cout << "반지름=" << radius << "인 원" << endl;
}
};
15. 다음 중 컴파일 시에 바인딩되지 않는 것은?
1) 중복된 함수 중에서 구분하여 호출
2) 중복된 연산자 중에서 구분하여 호출
3) 범위 지정 연산자(::)를 이용한 함수 호출
4) 순수 가상 함수 호출
답 : 4번
풀이 : 순수 가상 함수 호출은 실행 시에 바인딩 되므로 틀렸다.