C++의 다중 상속

Jinku Hu 2023년10월12일
  1. 다중 상속을 사용하여 주어진 두 클래스의 여러 속성을 다른 클래스에 적용
  2. virtual키워드를 사용하여 기본 클래스의 여러 사본 수정
C++의 다중 상속

이 기사에서는 C++에서 다중 상속을 사용하는 방법에 대한 여러 방법을 보여줍니다.

다중 상속을 사용하여 주어진 두 클래스의 여러 속성을 다른 클래스에 적용

C++의 클래스는 여러 상속을 가질 수 있으므로 둘 이상의 직접 기본 클래스에서 클래스를 파생시킬 수 있습니다.

이는 클래스가 신중하게 구현되지 않을 때 특별한 비정상적인 동작이있을 수 있음을 의미합니다. 예를 들어,C클래스가BA클래스에서 파생 된 다음 스 니펫 코드를 고려하십시오. 그들 모두는 특수 문자열을 출력하는 기본 생성자를 가지고 있습니다. 그러나mainc함수에서C유형 객체를 선언하면 세 개의 생성자가 출력을 인쇄합니다. 생성자는 상속 된 것과 동일한 순서로 호출됩니다. 반면에 소멸자는 역순으로 호출됩니다.

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class A {
 public:
  A() { cout << "A's constructor called" << endl; }
};

class B {
 public:
  B() { cout << "B's constructor called" << endl; }
};

class C : public B, public A {
 public:
  C() { cout << "C's constructor called" << endl; }
};

int main() {
  C c;
  return 0;
}

출력:

Bs constructor called
As constructor called
Cs constructor called

virtual키워드를 사용하여 기본 클래스의 여러 사본 수정

다음 프로그램은Planet클래스 생성자,MarsEarth생성자의 두 인스턴스를 각각 출력하고 마지막으로Rock클래스 생성자를 출력합니다. 또한Planet클래스의 소멸자는 객체가 범위를 벗어나면 두 번 호출됩니다. 하지만이 문제는MarsEarth클래스에virtual키워드를 추가하여 해결할 수 있습니다. 클래스에 여러 기본 클래스가있는 경우 파생 클래스가 두 개 이상의 기본 클래스에서 동일한 이름을 가진 멤버를 상속 할 가능성이 있습니다.

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class Planet {
 public:
  Planet(int x) { cout << "Planet::Planet(int ) called" << endl; }
};

class Mars : public Planet {
 public:
  Mars(int x) : Planet(x) { cout << "Mars::Mars(int ) called" << endl; }
};

class Earth : public Planet {
 public:
  Earth(int x) : Planet(x) { cout << "Earth::Earth(int ) called" << endl; }
};

class Rock : public Mars, public Earth {
 public:
  Rock(int x) : Earth(x), Mars(x) { cout << "Rock::Rock(int ) called" << endl; }
};

int main() { Rock tmp(30); }

출력:

Planet::Planet(int ) called
Mars::Mars(int ) called
Planet::Planet(int ) called
Earth::Earth(int ) called
Rock::Rock(int ) called
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C++ Class