class A { public:
virtualvoid f() { Print( __FUNCTION__ ); }
};
class B : public A { public:
virtualvoid f() { Print( __FUNCTION__ ); }
};
class H { public:
H( A* a ) { H::s[ 0 ] = a; }
staticvoid g();
static A* s[ 1 ];
};
A *H::s[ 1 ] = { 0 };
void H::g() { H::s[ 0 ].f(); } //еще обратил внимание, что в этом месте редактор выделяет (.f) зеленым
voidOnStart()
{
A* b = new B();
H h( b );
H::g(); //печатает A::f()
delete( b );
}
虚拟函数 操作中的一个错误
结果:A::f(),应该是B::f()
帮助在MAVERICKS操作系统上安装META TRADER 4,下载了所有程序,在MAC上播放,都是新的,任何东西都出现了错误。
/*moderator:将错误文本作为文件发送*/。
2 - 调试前。
3 - 后。
也许那里有差异,我根本不明白什么)
非常感谢您)
编译错误
而const不应该遵循静态
另外,这是一个虚假的保护,因为静态被通常的h()函数修改,而A::f()const甚至不会知道。
在虚拟函数的 操作中出现错误
结果:A::f(),应该是B::f()
编译错误
而const不应该遵循静态
另外,这是一个虚假的保护,因为静态被通常的h()函数修改,而A::f()const甚至不会知道。
在所有调用h( A* a)的情况下都会出现编译错误358
它只在(3)和(4)中是合理的,因为它不是h( const A* a)
类似的情况在早些时候得到了纠正https://www.mql5.com/ru/forum/1111/page1218#comment_1058402,但原因可能不同,因为在void f() const声明中存在const会影响错误的发生,而且没有成员函数。
在构建976中无法编译(错误358,但与之前描述的构建975中的错误不同)。
原因可能是Build 976修复了与以下事实有关的错误:从一个 常态类方法 调用的普通函数可以修改由非常态&引用传递给它的类成员。但是这里的指针是一个类成员,它的值在调用h( A* a )时保证不会被改变,而只能在声明h( A* &a )时被改变。在构建976中不编译(错误358,但与之前描述的不同,在构建975中没有发生错误)。
原因可能是Build 976修复了与以下事实有关的错误:从一个 常态类方法 调用的普通函数可以修改由非常态&引用传递给它的类成员。但是这里的指针是一个类成员,它的值在调用h( A* a )时保证不会被改变,而只有在声明h( A* &a )时才能被改变。