> 백엔드 개발 > C++ > C++ 구문 오류: 기본 클래스 생성자 호출이 올바르지 않습니다. 어떻게 처리해야 합니까?

C++ 구문 오류: 기본 클래스 생성자 호출이 올바르지 않습니다. 어떻게 처리해야 합니까?

王林
풀어 주다: 2023-08-21 21:16:45
원래의
1662명이 탐색했습니다.

C++ 구문 오류: 기본 클래스 생성자 호출이 올바르지 않습니다. 어떻게 처리해야 하나요?

C++ 프로그래밍에서는 기본 클래스 생성자가 호출되는 상황에 자주 직면합니다. 그러나 이 과정에서 기본 클래스 생성자가 잘못 호출되는 경우가 있습니다. 이러한 상황으로 인해 프로그램이 비정상적으로 종료되거나 알 수 없는 오류가 발생하는 경우가 많습니다. 이러한 상황이 발생하더라도 당황하지 마세요. 이 문서에서는 잘못된 기본 클래스 생성자 호출과 이를 처리하는 방법을 자세히 소개합니다.

1. 기본 클래스 생성자의 잘못된 호출

C++에서 파생 클래스의 생성자는 기본 클래스의 모든 멤버가 올바르게 초기화되도록 기본 클래스의 생성자를 호출해야 합니다. 일반적으로 파생 클래스 생성자의 멤버 초기화 목록에서 기본 클래스 생성자를 호출하는 것이 가장 일반적인 방법입니다. 그러나 기본 클래스 생성자를 호출하는 데 실수를 하면 기본 클래스 생성자가 잘못 호출되는 상황이 발생합니다. 아래에는 기본 클래스 생성자 호출이 잘못된 몇 가지 일반적인 상황이 나열되어 있습니다.

  1. 기본 클래스 생성자의 매개변수 유형 불일치: 기본 클래스 생성자를 호출할 때 파생 클래스 생성자의 매개변수가 유형과 일치하는지 확인해야 합니다. 기본 클래스 생성자의 매개변수 유형입니다. 기본 클래스와 파생 클래스의 생성자 매개변수가 일치하지 않으면 컴파일 오류가 발생합니다. 예:
#include<iostream>
using namespace std;
 
class Base{
    public:
        Base(){}
        Base(int a){ cout<<"Base class with value : "<<a<<"
";}
};
 
class Derived: public Base{
    public:
        Derived(){}
        Derived(int a){ cout<<"Derived class with value : "<<a<<"
";}
};
 
int main(){
    Derived d(10); // 编译错误:没有与此调用匹配的函数
    return 0;
}
로그인 후 복사
  1. 기본 클래스 생성자가 여러 번 호출됩니다. 파생 클래스의 생성자에서 기본 클래스 생성자를 호출하는 경우 한 번만 호출해야 합니다. 그렇지 않으면 기본 클래스의 멤버가 초기화될 수 있습니다. 여러 번 실행하면 오류가 발생합니다. 예:
#include<iostream>
using namespace std;

class Base{
    public:
        Base(){ cout<<"Base class constructor called
"; }
};

class Derived: public Base{
    public:
        Derived(){ cout<<"Derived class constructor called
"; }
        Derived(int a){ cout<<"Derived class constructor with value : "<<a<<" called
"; }
};

int main(){
    Derived d;
    return 0;
}
로그인 후 복사

출력 결과는 다음과 같습니다.

Base class constructor called
Derived class constructor called
로그인 후 복사

위 코드에서 Derived 클래스의 생성자는 Base 클래스의 생성자를 호출하므로 "Base class constructor selected"가 출력되지만 Derived 클래스에는 생성자는 하나뿐이므로 기본적으로 매개변수 없는 생성자가 호출되므로 "파생 클래스 생성자 호출"도 출력됩니다. 기본 클래스 생성자를 두 번 호출하면 오류가 발생합니다.

#include<iostream>
using namespace std;
 
class Base{
    public:
        Base(){ cout<<"Base class constructor called
"; }
};
 
class Derived: public Base{
    public:
        Derived(){ cout<<"Derived class constructor called
"; }
        Derived(int a){ cout<<"Derived class constructor with value : "<<a<<" called
"; }
};
 
int main(){
    Derived d(10);
    return 0;
}
로그인 후 복사

출력은 다음과 같습니다.

Base class constructor called
Derived class constructor with value : 10 called
Base class constructor called
로그인 후 복사

Derived 클래스의 생성자에서 기본 클래스의 생성자가 두 번 호출되므로 두 번 출력됩니다. "기본 클래스 "라고 불리는 생성자. 이는 C++에서 파생 클래스 개체의 생성 프로세스가 먼저 기본 클래스 생성자를 호출한 다음 파생 클래스 생성자를 호출하기 때문입니다. 따라서 파생 클래스 생성자에서 기본 클래스 생성자를 두 번 호출하면 기본 클래스 생성자가 두 번 호출되어 오류가 발생합니다.

  1. 기본 클래스 생성자가 호출되지 않음: 기본 클래스 생성자에서 가상 함수를 호출할 때 파생 클래스 생성자에서 기본 클래스 생성자를 호출하면 기본 클래스의 가상 함수가 호출되지 않으므로 5월 프로그램 오류가 발생합니다.
#include<iostream>
using namespace std;
 
class Base{
    public:
        Base(){ f(); }
        virtual void f(){ cout<<"Base
"; }
};
 
class Derived: public Base{
    public:
        Derived(){ cout<<"Derived
"; }
        void f(){ cout<<"Derived
"; }
};
 
int main(){
    Derived d;
    return 0;
}
로그인 후 복사

출력 결과는 다음과 같습니다.

Derived
로그인 후 복사

위 프로그램에서 기본 클래스 생성자의 f() 함수는 가상 함수이며 파생 객체가 생성되면 파생 클래스의 생성자가 먼저 생성자를 호출합니다. 기본 클래스의 f() 함수가 호출됩니다. 그러나 기본 클래스 생성자에서 f()가 호출되면 파생 클래스 객체의 생성자가 아직 실행되지 않았으므로 파생 클래스의 f() 함수는 아직 호출되지 않았으며, 파생 클래스의 f() 함수만 호출됩니다. 기본 클래스가 호출되었습니다. 따라서 출력은 "파생"이 아닌 "기본"입니다.

2. 기본 클래스 생성자의 잘못된 호출을 처리하는 방법은 무엇입니까?

기본 클래스 생성자가 잘못 호출되는 상황이 발생하는 경우 어떻게 처리해야 하나요? 다음은 잘못된 기본 클래스 생성자 호출을 처리하는 여러 가지 방법입니다.

  1. 매개변수 유형 확인: 기본 클래스 생성자를 호출할 때 매개변수 유형 불일치 오류가 발생하는 경우 매개변수의 데이터 유형이 올바른지 확인해야 합니다. int, double, char 등과 같은 데이터 유형인지 여부 등입니다.
  2. 생성자 호출 확인: 기본 클래스 생성자가 여러 번 호출되는 상황이 발생하는 경우 파생 클래스 생성자에서 기본 클래스 생성자가 올바르게 호출되는지 확인하고 한 번만 호출되는지 확인해야 합니다.
  3. 기본 클래스 생성자에서 가상 함수 호출 방지: 기본 클래스 생성자에서 가상 함수를 호출하고 파생 클래스 생성자에서 기본 클래스 생성자를 호출하는 경우 기본 클래스 생성자 함수에서 가상 함수를 호출하지 않아야 합니다. 기본 클래스 생성자에서 가상 함수를 호출해야 하는 경우 오류를 방지하려면 순수 가상 함수나 다른 메서드를 사용해야 합니다.
  4. 생성자에서 스마트 포인터 사용 방지: 생성자에서 스마트 포인터를 사용하는 경우 스마트 포인터에서 현재 개체에 대한 포인터를 사용하지 않아야 합니다. 현재 개체가 초기화되기 전에 스마트 포인터의 값이 NULL이 되어 런타임 오류가 발생할 수 있기 때문입니다.

즉, 기본 클래스 생성자에 대한 잘못된 호출이 발생하면 당황하지 말고 오류를 주의 깊게 확인하고 위의 처리 방법에 따라 처리해야 합니다. 이러한 방식으로 기본 클래스 생성자에 대한 잘못된 호출로 인해 발생하는 프로그램 실행 오류를 효과적으로 방지할 수 있습니다.

위 내용은 C++ 구문 오류: 기본 클래스 생성자 호출이 올바르지 않습니다. 어떻게 처리해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿