Qaupot Blog
Software Engineering, Trip

410. override, final keyword (C++11)

πŸ• Wed, 17 Aug 2016 09:00:00 GMT

override keyword (C++11)

C++11 λΆ€ν„° μ‚¬μš©ν•  수 μžˆλŠ” override keywordλŠ”
λͺ…μ‹œμ μœΌλ‘œ 이 λ©”μ†Œλ“œκ°€ override λ˜μ—ˆμŒμ„ μ•Œλ¦¬λŠ” ν‚€μ›Œλ“œμž…λ‹ˆλ‹€.

#include <iostream>
class Person
{
public:
    virtual void VirtualMethod()
    {
        std::cout << "Person's Virtual Method" << std::endl;
    }
};

class Student : public Person
{
public:
    //virtual void VirtualMethod() override
    virtual void VirtualMethod(int parameter) override // compile error
    {
        std::cout << "Student's Virtual Method" << std::endl;
    }
};

int main(int argc, const char * argv[])
{
    Student student;
    student.VirtualMethod(0);
    return 0;
}

이 ν‚€μ›Œλ“œλŠ” 가상 ν•¨μˆ˜(virtual function)μ—λ§Œ μ‚¬μš©ν•  수 있으며,
λΆ€λͺ¨ 클래슀의 가상 ν•¨μˆ˜λ₯Ό override ν•˜λŠ” κ²½μš°μ—λ§Œ 컴파일이 λ˜λ„λ‘ ν•΄ μ€λ‹ˆλ‹€.

μ˜ˆμ œμ—μ„œ Person 클래슀의 VirtualMethod λ©”μ†Œλ“œλŠ” νŒŒλΌλ―Έν„°κ°€ μ—†μŠ΅λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜, Student 클래슀의 VirtualMethodμ—λŠ” νŒŒλΌλ―Έν„°κ°€ ν•˜λ‚˜ μ‘΄μž¬ν•©λ‹ˆλ‹€.
μ΄λŸ¬ν•œ μΌ€μ΄μŠ€μ—μ„œ override ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬ λ†“μœΌλ©΄ overrideκ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— 컴파일 μ—λŸ¬κ°€ λ‚©λ‹ˆλ‹€.

κΈ°μ‘΄μ—λŠ” ν”„λ‘œκ·Έλž˜λ¨Έμ˜ μ‹€μˆ˜λ‘œ μ˜€λ²„λΌμ΄λ“œ λ˜μ–΄μ•Ό ν•˜λŠ” λΆ€λͺ¨μ˜ λ©”μ†Œλ“œ μ •μ˜μ™€ λ‹€λ₯΄κ²Œ μ„ μ–Έν•˜λŠ” 경우
컴파일 νƒ€μž„μ— 확인이 λ˜μ§€ μ•Šμ•˜μœΌλ©°, λŸ°νƒ€μž„μ— μ²΄ν¬ν•˜λŠ” 것도 λ†“μΉ˜κΈ° μ‰¬μ› μŠ΅λ‹ˆλ‹€.

C++11 μ΄μƒμ˜ 문법을 μ‚¬μš©ν•˜λŠ” 경우, μœ„μ™€ 같이 override ν‚€μ›Œλ“œλ₯Ό λΆ™μ—¬λ†“μœΌλ©΄ μ‹€μˆ˜λ₯Ό 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

final keyword (C++11)

λ§ˆμ°¬κ°€μ§€λ‘œ C++11 λΆ€ν„° μ‚¬μš©ν•  수 μžˆλŠ” final keywordλŠ”
λͺ…μ‹œμ μœΌλ‘œ 더 이상 이 λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œ ν•  수 μ—†μŒμ„ μ•Œλ¦¬κ±°λ‚˜,
더 이상 상속을 ν•  수 μ—†μŒμ„ μ•Œλ¦¬λŠ” ν‚€μ›Œλ“œμž…λ‹ˆλ‹€.

#include <iostream>
class Person
{
public:
    virtual void VirtualMethod() final
    {
        std::cout << "Person's Virtual Method" << std::endl;
    }
};

class Student final : public Person
{
public:
    virtual void VirtualMethod() override // compile error
    {
        std::cout << "Student's Virtual Method" << std::endl;
    }
};
        
class Employee : public Student // compile error
{
};

int main(int argc, const char * argv[])
{
    Student student;
    student.VirtualMethod();
    return 0;
}

Person의 VirtualMethod에 λŒ€ν•΄ final 선언이 λ˜μ–΄ μžˆμœΌλ―€λ‘œ,
StudentλŠ” VirtualMethodλ₯Ό μ˜€λ²„λΌμ΄λ“œ ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

λ˜ν•œ Student classλŠ” final 클래슀둜 μ„ μ–Έλ˜μ—ˆμœΌλ―€λ‘œ,
Employee classλŠ” Studentλ₯Ό 상속 받을 수 μ—†μŠ΅λ‹ˆλ‹€.

이 λΈ”λ‘œκ·ΈλŠ” 개인 λΈ”λ‘œκ·Έμž…λ‹ˆλ‹€. κ²Œμ‹œκΈ€μ€ 였λ₯˜λ₯Ό ν¬ν•¨ν•˜κ³  μžˆμ„ 수 μžˆμ§€λ§Œ, μ €μžλŠ” 였λ₯˜λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λ…Έλ ₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
κ²Œμ‹œκΈ€μ— λ³„λ„μ˜ 고지가 μ—†λŠ” 경우, ν¬λ¦¬μ—μ΄ν‹°λΈŒ 컀먼즈 μ €μž‘μžν‘œμ‹œ-λΉ„μ˜λ¦¬-λ³€κ²½κΈˆμ§€ 4.0 λΌμ΄μ„ μŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.