English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이 문서에서는 C를 배웁니다 ++프로그래밍에서의 다양한 상속 모델: 예제와 함께 다중 상속, 다중 상속, 계층 상속.
상속이는 객체 지향 프로그래밍 언어의 핵심 기능 중 하나입니다. 소프트웨어 개발자는 기존 클래스에서 새로운 클래스를 파생할 수 있습니다. 파생 클래스는 기본 클래스(기존 클래스)의 기능을 상속받습니다.
C ++프로그래밍에는 여러 상속 모델이 있습니다.
C ++프로그래밍에서는 단순히 기본 클래스에서 클래스를 파생할 뿐만 아니라, 파생 클래스에서 또 다른 클래스를 파생할 수도 있습니다. 이 상속 형식은 다중 상속으로 불립니다.
class A { ... .. ... }; class B: public A { ... .. ... }; class C: public B { ... ... ... };
이곳에서, 클래스 B는 기본 클래스 A에서 파생되고, 클래스 C는 파생 클래스 B에서 파생됩니다.
#include <iostream> using namespace std; class A { public: void display() { cout << "기본 클래스의 내용."; } }; class B : public A { }; class C : public B { }; int main() { C obj; obj.display(); return 0; }
출력 결과
기본 클래스의 내용.
이 프로그램에서, C 클래스는 B 클래스에서 파생되었습니다(B 클래스는 기본 클래스 A에서 파생되었습니다).
C 클래스의 obj 객체는 main() 함수에서 정의됩니다.
display() 함수를 호출할 때, 클래스 A에서의 display()를 실행합니다. 이는 클래스 C와 B에 display() 함수가 없기 때문입니다.
컴파일러는 먼저 클래스 C에서 display() 함수를 찾습니다. 이 함수가 해당 클래스에서 존재하지 않기 때문에, 함수는 클래스 B에서 찾습니다(클래스 C는 B에서 파생되기 때문입니다).
这个display()函数在B类中也不存在,所以编译器在A类中寻找它(因为B是从A派生出来的)。
C에서 display() 함수가 있으면, 컴파일러는 클래스 A의 display()를 덮어씁니다(이는 B 클래스에서도 display() 함수가 없기 때문입니다, 따라서 컴파일러는 A 클래스에서 그것을 찾습니다, B는 A에서 파생되었기 때문입니다).멤버 함수 오버라이드)
C ++프로그래밍에서, 한 클래스는 여러 부모 클래스에서 파생될 수 있습니다. 예를 들어: Bat 클래스는 Mammal과 WingedAnimal 기본 클래스에서 파생됩니다. 이는 매우 의미가 있으며,Batman은 포유动物(Mammal)이며 날개를 가진 동물(WingedAnimal)입니다.
#include <iostream> using namespace std; class Mammal { public: Mammal() { cout << "哺乳动物可以直接出生。" << endl; } }; class WingedAnimal { public: WingedAnimal() { cout << "날개를 가진 동물은 날을 날 수 있습니다." << endl; } }; class Bat : public Mammal, public WingedAnimal { }; int main() { Bat b1; return 0; }
출력 결과
哺乳动物可以直接出生. 날개를 가진 동물은 날을 날 수 있습니다.
다중 继承의 가장 명확한 문제는 함수 재정의 시기에 발생합니다.
두 개의 기본 클래스가 동일한 함수를 가지고 있지만, 이 함수를 재정의하지 않은 파생 클래스가 있다고 가정해 봅시다.
기본 클래스의 객체를 사용하여 이 함수를 호출하려고 시도하면, 컴파일러는 오류를 표시합니다. 이는 컴파일러가 호출할 함수를 알 수 없기 때문입니다. 예를 들어:
class base1 { public: void someFunction( ) { .... ... .... } }; class base2 { void someFunction( ) { .... ... .... } }; class derived : public base1, public base2 { }; int main() { derived obj; obj.someFunction() // 에러! }
이 문제는 범위 해석 함수를 사용하여 base에 속하는 함수를 지정할 수 있습니다.1또는 base2을 통해 문제를 해결
int main() { obj.base1::someFunction( ); // base 호출1클래스 함수 obj.base2::someFunction(); // base 호출2클래스 함수 }
기본 클래스에서 여러 클래스를 继承하는 경우, 이를 분할繼承이라고 합니다. 분할繼承에서는, 자식 클래스에서 공통된 모든 기능이 기본 클래스에 포함됩니다.
예를 들어: 물리학, 화학, 생물학 모두 과학과에서 비롯됩니다.
class base_class { ... .. ... } class first_derived_class: public base_class { ... .. ... } class second_derived_class: public base_class { ... .. ... } class third_derived_class: public base_class { ... .. ... }