문제. 특정 매개변수 집합과 유형으로 부모 클래스에서 가상 함수 를 선언한 후 자손 클래스에서 해당 가상 함수에 대한 매개변수 수와 유형을 변경할 수 있습니까?
한편으로 Reference는 "가상 함수 는 파생 클래스에서 재정의될 수 있습니다.가상 함수에 대해 호출 할 함수 정의 의 선택 은 동적(런타임에)입니다. 일반적인 경우는 기본 클래스에, 파생 클래스에는 이 함수의 자체 버전이 있습니다. 반면에 핸드북에 제공된 예제는 가상 함수가 함수 정의 헤더 가 아니라 함수 정의 본문 에서 다른 경우를 다룹니다.
내가 기억하는 한. 그러나 매개 변수의 유형과 수에 절대적으로 zhoskoe 차이가 필요합니다.
또한 이러한 전달된 값과 기본값에 주의해야 합니다.
간단하게 예를 들어 드리겠습니다.
이 옵션이 작동합니다
boll MyFunction( int Param);
boll MyFunction( int Param1, int Param2);
그런 것은 없습니다(또는 오히려 롤 수 있지만 버그와 특정 예약이 있음)
//Ели второй параметр будет упущен, то компилятор может и не "понять" смысла всего задуманного
boll MyFunction( int Param);
boll MyFunction( int Param1, int Param2 = 0 );
//Так тоже может не прокатить по причине совпадения типов у второго параметра
boll MyFunction( int Param1, color Param2);
boll MyFunction( int Param1, int Param2);
class C_A //родительский класс
{
public :
virtualdouble function( double a1, double a2, double a3) { return ; }
}
class C_B : public C_A
{
public :
virtualdouble function( double a1, double a2, double a3) { return (a1); }
}
class C_C : public C_A
{
public : virtualdouble function( double a1, double a2, double a3) { return (a2); }
double function( double a1, double a2) { return (a1+a2); }
}
//где-то в программе объявляем указатель
C_A *pointer;
int random= rand ()%2;
switch (random)
{
case0 : pointer= new C_B; break ;
case1 : pointer= new C_C; break ;
}
//вызываем виртуальный методif (pointer!= NULL )
{
pointer.function(a1,a2,a3);
}
C_C 클래스의 함수 메서드가 오버로드되었는지 여부에 관계없이 가상 함수 는 포인터.function(a1,a2,a3)의 세 가지 매개 변수만으로 호출할 수 있습니다. 따라서 프로그램은 가상 함수를 호출할 때 C_C 클래스에서 매개변수가 두 개인 메서드에 도달하지 않습니다. 바르게?
C_C 클래스의 함수 메서드가 오버로드되었는지 여부에 관계없이 가상 함수 는 포인터.function(a1,a2,a3)의 세 가지 매개 변수만으로 호출할 수 있습니다. 따라서 프로그램은 가상 함수를 호출할 때 C_C 클래스에서 매개변수가 두 개인 메서드에 도달하지 않습니다. 바르게?
생성자와 소멸자에 __FUNCTION__ 매크로를 사용하여 출력물을 삽입하여 프로그램이 수행하는 작업을 분석하면 매우 유용할 것입니다.
저를 대신하여 기본 클래스 포인터를 선언함으로써 기본 클래스를 통해 자손에 대한 "터널" 통로를 구축할 수 있다고 추가하겠습니다. 따라서 컴파일러는 자손에 대한 호출을 통해 자손의 기본 클래스에 선언된 함수만 보게 됩니다. 동일한 프로그램 내에서라도 자식 개체를 직접 선언하면 모든 기능을 사용할 수 있습니다.
class C_A //родительский класс
{
public :
virtualdouble function( double a1, double a2, double a3) { return ; }
}
class C_B : public C_A
{
public :
virtualdouble function( double a1, double a2, double a3) { return (a1); }
}
class C_C : public C_A
{
public :
virtualdouble function( double a1, double a2, double a3) { return (a2); }
double function( double a1, double a2) { return (a1+a2); }
}
//где-то в программе объявляем указатель
C_A *pointer;
int random= rand ()% 2 ;
switch (random)
{
case0 : pointer= new C_B; break ;
case1 : pointer= new C_C; break ;
//вызываем виртуальный методif (pointer!= NULL )
{
pointer.function(a1,a2,a3);
}
C_С *new_pointer= new C_C;
new_pointer.function(a1,a2);
C_C 클래스의 함수 메서드가 오버로드되었는지 여부에 관계없이 가상 함수 는 포인터.function(a1,a2,a3)의 세 가지 매개 변수만으로 호출할 수 있습니다. 따라서 프로그램은 가상 함수를 호출할 때 C_C 클래스에서 매개변수가 두 개인 메서드에 도달하지 않습니다. 바르게?
문제. 특정 매개변수 집합과 유형으로 부모 클래스에서 가상 함수 를 선언한 후 자손 클래스에서 해당 가상 함수에 대한 매개변수 수와 유형을 변경할 수 있습니까?
한편으로 Reference는 "가상 함수 는 파생 클래스에서 재정의될 수 있습니다. 가상 함수에 대해 호출 할 함수 정의 의 선택 은 동적(런타임에)입니다. 일반적인 경우는 기본 클래스에 , 파생 클래스에는 이 함수의 자체 버전이 있습니다. 반면에 핸드북에 제공된 예제는 가상 함수가 함수 정의 헤더 가 아니라 함수 정의 본문 에서 다른 경우를 다룹니다.
내가 기억하는 한. 그러나 매개 변수의 유형과 수에 절대적으로 zhoskoe 차이가 필요합니다.
또한 이러한 전달된 값과 기본값에 주의해야 합니다.
간단하게 예를 들어 드리겠습니다.
이 옵션이 작동합니다
그런 것은 없습니다(또는 오히려 롤 수 있지만 버그와 특정 예약이 있음)
클래스에 메소드 RELOAD가 있는 경우 정확히 동일한 가비지가 생성됩니다.
기본 옵션을 제외하고 정의의 정확한 사본입니다(기본값은 다를 수 있지만 사용하지 않는 것이 가장 좋습니다).
흥미롭게 도 내가 알기로는 기능 가상화와 기능 오버로딩은 약간 다릅니다. 그리고 mql5 는 기능을 가상화할 때 기능 헤더의 하드 카피가 있어야 한다고 말합니다(기본 매개변수는 고려하지 않음).
흥미롭게 도 내가 알기로는 기능 가상화와 기능 오버로딩은 약간 다릅니다. 그리고 mql5 는 기능을 가상화할 때 기능 헤더의 하드 카피가 있어야 한다고 말합니다(저는 기본 매개변수를 고려하지 않습니다).
> 질문. 특정 매개변수 집합과 유형으로 부모 클래스에서 가상 함수 를 선언한 후 자손 클래스에서 해당 가상 함수에 대한 매개변수 수와 유형을 변경할 수 있습니까?
내가 모든 것을 올바르게 이해했다면 후손은 조상의 기능에 과부하가 걸립니다.
솔직히 말해서, 가상의 것들로 비슷한 일을 했는지 여부는 기억나지 않지만(한 것 같아요), 과부하에 대한 진술은 사실입니다. 한 번 나 자신이 이 갈퀴를 밟았습니다.
추신
모든 것이 올바르게 수행되면 내가 이해하는 것처럼 매개 변수의 수를 늘리거나 줄일 수 있습니다. 매개 변수의 수는 동일하게 유지되지만 유형이 변경되면 어려움이 있습니다 ...
기본적으로 다음은 예입니다.
C_C 클래스의 함수 메서드가 오버로드되었는지 여부에 관계없이 가상 함수 는 포인터.function(a1,a2,a3)의 세 가지 매개 변수만으로 호출할 수 있습니다. 따라서 프로그램은 가상 함수를 호출할 때 C_C 클래스에서 매개변수가 두 개인 메서드에 도달하지 않습니다. 바르게?
일반적으로 다음 예를 스케치했습니다.
C_C 클래스의 함수 메서드가 오버로드되었는지 여부에 관계없이 가상 함수 는 포인터.function(a1,a2,a3)의 세 가지 매개 변수만으로 호출할 수 있습니다. 따라서 프로그램은 가상 함수를 호출할 때 C_C 클래스에서 매개변수가 두 개인 메서드에 도달하지 않습니다. 바르게?
생성자와 소멸자에 __FUNCTION__ 매크로를 사용하여 출력물을 삽입하여 프로그램이 수행하는 작업을 분석하면 매우 유용할 것입니다.
저를 대신하여 기본 클래스 포인터를 선언함으로써 기본 클래스를 통해 자손에 대한 "터널" 통로를 구축할 수 있다고 추가하겠습니다. 따라서 컴파일러는 자손에 대한 호출을 통해 자손의 기본 클래스에 선언된 함수만 보게 됩니다. 동일한 프로그램 내에서라도 자식 개체를 직접 선언하면 모든 기능을 사용할 수 있습니다.
일반적으로 다음 예제를 스케치했습니다.
C_C 클래스의 함수 메서드가 오버로드되었는지 여부에 관계없이 가상 함수 는 포인터.function(a1,a2,a3)의 세 가지 매개 변수만으로 호출할 수 있습니다. 따라서 프로그램은 가상 함수를 호출할 때 C_C 클래스에서 매개변수가 두 개인 메서드에 도달하지 않습니다. 바르게?
내 경험에 따르면 이 방법을 사용하여 코드를 완성할 수 있습니다.
그리고 예시와 예능으로 첨부파일을 보실 수 있습니다.
포인터와 new를 사용하면 어지럽히는 사냥이 아니므로 간단히 작업 클래스를 변수로 선언했습니다.
Timer Expert Advisor는 일정한 간격으로 난수 0/1을 생성하고 결과에 따라 MarketBuy / MarketSell의 두 가지 기능 중 하나를 수행합니다.
원하는 경우 다음과 같이 선언하는 것이 가능했습니다.
그러나 다음과 충돌에 대한 버그가 나타날 수 있습니다.
추신
급하게 만든거라 약간의 오차가 있을 수 있습니다.
그러나 원칙적으로 주요 아이디어는 이해할 수 있습니다.
소중한 조언과 조언 정말 감사합니다 ! 이론과 실습을 모두 할 수 있는 시간만 충분하다면 꼭 사용하겠습니다.
내 경험에 따르면 이 방법을 사용하여 코드를 완성할 수 있습니다.
정확히 왜? 함정은 무엇입니까?
예전에는 이런 문제가 있었습니다. 그러나 지금은 어느 것이 기억나지 않습니다.
일반적으로 나는 그것에 익숙합니다.
일반적으로 물론 차이가 없습니다. 적어도 제 예에서는 장소를 바꾸려고 시도했지만 모든 것이 작동했습니다 ...
예전에는 이런 문제가 있었습니다. 그러나 지금은 어느 것이 기억나지 않습니다.