C 언어
이 튜토리얼에서는 예제를 통해 C++ 가상 함수와 그 사용법에 대해 알아볼 것입니다.
가상 함수는 파생 클래스에서 재정의할 것으로 예상되는 기본 클래스의 멤버 함수입니다.
기본적으로 가상 함수는 함수가 재정의되도록 하기 위해 기본 클래스에서 사용됩니다. . 이것은 특히 기본 클래스의 포인터가 파생 클래스의 개체를 가리키는 경우에 적용됩니다.
예를 들어, 아래 코드를 고려하십시오.
class Base {
public:
void print() {
// code
}
};
class Derived : public Base {
public:
void print() {
// code
}
};
나중에 Base
포인터를 생성하면 Derived
의 개체를 가리키는 유형 클래스를 호출하고 print()
함수를 호출하면 print()
Base
의 기능 수업.
즉, Base
의 멤버 함수는 재정의되지 않습니다.
int main() {
Derived derived1;
Base* base1 = &derived1;
// calls function of Base class
base1->print();
return 0;
}
이를 피하기 위해 print()
를 선언합니다. Base
의 기능 virtual
를 사용하여 가상 클래스 키워드.
class Base {
public:
virtual void print() {
// code
}
};
가상 함수는 C++에서 다형성의 필수적인 부분입니다. 자세히 알아보려면 C++ 다형성에 대한 자습서를 확인하세요.
<시간>
#include <iostream>
using namespace std;
class Base {
public:
virtual void print() {
cout << "Base Function" << endl;
}
};
class Derived : public Base {
public:
void print() {
cout << "Derived Function" << endl;
}
};
int main() {
Derived derived1;
// pointer of Base type that points to derived1
Base* base1 = &derived1;
// calls member function of Derived class
base1->print();
return 0;
}
출력
Derived Function
여기에서 print()
을 선언했습니다. Base
의 기능 virtual
로 .
따라서 이 함수는 Base
포인터를 사용하는 경우에도 재정의됩니다. Derived
를 가리키는 유형 개체 파생1 .
C++ 11은 새로운 식별자 override
를 제공했습니다. 가상 기능을 사용하는 동안 버그를 방지하는 데 매우 유용합니다.
이 식별자는 기본 클래스의 멤버 함수를 재정의하는 파생 클래스의 멤버 함수를 지정합니다.
예를 들어,
class Base {
public:
virtual void print() {
// code
}
};
class Derived : public Base {
public:
void print() override {
// code
}
};
Derived
에서 함수 프로토타입을 사용하는 경우 클래스 외부에서 해당 함수를 정의한 다음 다음 코드를 사용합니다.
class Derived : public Base {
public:
// function prototype
void print() override;
};
// function definition
void Derived::print() {
// code
}
<시간> 가상 함수를 사용할 때 파생 클래스의 멤버 함수를 선언할 때 실수가 있을 수 있습니다.
override
사용 식별자는 이러한 실수가 발생했을 때 오류 메시지를 표시하도록 컴파일러에 프롬프트합니다.
그렇지 않으면 프로그램은 단순히 컴파일되지만 가상 기능은 무시되지 않습니다.
이러한 가능한 실수 중 일부는 다음과 같습니다.
print()
인 경우 , 그러나 파생 클래스의 재정의 함수의 이름을 실수로 pint()
으로 지정했습니다. .void
인 경우 유형이지만 파생 클래스의 함수는 int
입니다. 유형.
기본 클래스 Animal
이 있다고 가정합니다. 및 파생 클래스 Dog
및 Cat
.
각 클래스에 type이라는 데이터 멤버가 있다고 가정합니다. . 이러한 변수가 각각의 생성자를 통해 초기화된다고 가정합니다.
class Animal {
private:
string type;
... .. ...
public:
Animal(): type("Animal") {}
... .. ...
};
class Dog : public Animal {
private:
string type;
... .. ...
public:
Animal(): type("Dog") {}
... .. ...
};
class Cat : public Animal {
private:
string type;
... .. ...
public:
Animal(): type("Cat") {}
... .. ...
};
이제 프로그램에서 두 개의 public
각 클래스에 대한 기능:
getType()
유형의 값을 반환하려면 print()
type의 값을 출력하려면 각 클래스에서 이 두 함수를 별도로 생성하고 재정의할 수 있습니다. 이는 길고 지루할 것입니다.
또는 getType()
를 만들 수 있습니다. 가상 Animal
클래스를 만든 다음 별도의 단일 print()
을 만듭니다. Animal
포인터를 받는 함수 인수로 입력하십시오. 그런 다음 이 단일 기능을 사용하여 가상 기능을 재정의할 수 있습니다.
class Animal {
... .. ...
public:
... .. ...
virtual string getType {...}
};
... .. ...
... .. ...
void print(Animal* ani) {
cout << "Animal: " << ani->getType() << endl;
}
이렇게 하면 코드가 더 짧아집니다 , 청소기 , 및 덜 반복적 .
<시간>
// C++ program to demonstrate the use of virtual function
#include <iostream>
#include <string>
using namespace std;
class Animal {
private:
string type;
public:
// constructor to initialize type
Animal() : type("Animal") {}
// declare virtual function
virtual string getType() {
return type;
}
};
class Dog : public Animal {
private:
string type;
public:
// constructor to initialize type
Dog() : type("Dog") {}
string getType() override {
return type;
}
};
class Cat : public Animal {
private:
string type;
public:
// constructor to initialize type
Cat() : type("Cat") {}
string getType() override {
return type;
}
};
void print(Animal* ani) {
cout << "Animal: " << ani->getType() << endl;
}
int main() {
Animal* animal1 = new Animal();
Animal* dog1 = new Dog();
Animal* cat1 = new Cat();
print(animal1);
print(dog1);
print(cat1);
return 0;
}
출력
Animal: Animal Animal: Dog Animal: Cat
여기서는 가상 함수 getType()
을 사용했습니다. 및 Animal
포인터 ani print()
반복을 피하기 위해 모든 클래스에서 사용할 수 있습니다.
void print(Animal* ani) {
cout << "Animal: " << ani->getType() << endl;
}
main()
에서 , 3개의 Animal
를 만들었습니다. Animal
객체를 동적으로 생성하기 위한 포인터 , Dog
및 Cat
수업.
// dynamically create objects using Animal pointers
Animal* animal1 = new Animal();
Animal* dog1 = new Dog();
Animal* cat1 = new Cat();
그런 다음 print()
다음 포인터를 사용하는 함수:
print(animal1)
일 때 가 호출되면 포인터가 Animal
을 가리킵니다. 물체. 따라서 Animal
의 가상 함수는 클래스는 print()
내부에서 실행됩니다. .print(dog1)
일 때 가 호출되면 포인터가 Dog
를 가리킵니다. 물체. 따라서 가상 기능이 재정의되고 Dog
의 기능이 print()
내부에서 실행됩니다. .print(cat1)
일 때 가 호출되면 포인터가 Cat
을 가리킵니다. 물체. 따라서 가상 기능은 재정의되고 Cat
의 기능은 print()
내부에서 실행됩니다. .C 언어
수업이란 무엇입니까? C++ 클래스는 데이터와 데이터를 조작하기 위한 메서드를 하나로 결합합니다. 클래스는 또한 객체의 형태를 결정합니다. 클래스에 포함된 데이터와 메서드를 클래스 멤버라고 합니다. 클래스는 사용자 정의 데이터 유형입니다. 클래스 멤버에 액세스하기 위해 클래스의 인스턴스를 사용합니다. 클래스를 개체에 대한 청사진으로 볼 수 있습니다. 클래스는 집의 프로토타입이 됩니다. 문, 창문, 바닥 등의 위치와 크기를 보여줍니다. 이러한 설명에서 집을 지을 수 있습니다. 집이 대상이 됩니다. 프로토타입으로 많은 집을 만들 수
C++에서 다형성이란 무엇입니까? C++에서 다형성은 멤버 함수를 호출/호출하는 객체에 따라 다르게 동작하도록 합니다. 다형성(Polymorphism)은 여러 형태를 갖는다는 의미의 그리스어입니다. 상속을 통해 관련된 클래스 계층이 있을 때 발생합니다. 예를 들어 makeSound() 함수가 있다고 가정합니다. 고양이가 이 함수를 호출하면 야옹 소리가 납니다. 젖소가 동일한 기능을 호출하면 야옹 소리가 납니다. 우리는 하나의 기능을 가지고 있지만 상황에 따라 다르게 작동합니다. 함수에는 여러 가지 형태가 있습니다.