9장 가상 함수와 추상 클래스 (이론 문제 풀이)

sua·2022년 4월 9일
0

명품 C++ Programming

목록 보기
3/10
post-thumbnail

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)
  • (2) - Derived::f() called
  • (3) - Base::f() called
  • (4) - Base::f() called
  • (5) - Base::f() called

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()

  • 답 : 1, 2, 3 번

2) 다음 코드가 실행될 때 출력되는 결과는 무엇인가?

C c;
c.f(); // (2)
A* pa;
B* pb;
pa = pb = &c;
pb->f(); // (3)
pa->f(); // (4)
pa->func(); // (5)
  • (2) - c::f() called
  • (3) - c::f() called
  • (4) - c::f() called
  • (5) - c::f() called

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) 다음 중 오류가 발생하는 것을 있는 대로 골라라.

  • (1) Shape shape;
  • (2) Shape *p;
  • (3) Circle circle(10);
  • (4) Circle *pCircle;
    답 : 1번, 3번
    풀이 : Shape은 추상 클래스이고, Circle 또한 기본 클래스의 순수 가상 함수를 구현하지 않았으므로 추상 클래스이다. 따라서 객체를 생성하지 못한다.

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번
풀이 : 순수 가상 함수 호출은 실행 시에 바인딩 되므로 틀렸다.

profile
가보자고

0개의 댓글

관련 채용 정보