编译器的奇怪行为
Weird behaviour of compiler
我有简单的程序
#include <iostream>
using namespace std;
struct A
{
A(){}
void print(int i)
{
cout << "A::print: " << i << endl;
}
};
struct B : public A
{
B() : A() {}
virtual void print(int i) {};
};
struct C : public B
{
C() : B() {}
virtual void print(int i)
{
cout << "C::print: " << i << endl;
}
};
void main()
{
A* ca = new C();
C* cc = new C();
ca->print(1);
cc->print(1);
}
而且我不明白为什么我的编译器 (msvc2008) 没有显示任何警告。也许我不了解虚函数的机制?事实上,我们错误地重新定义了方法,这取决于使用的指针
In fact, we have wrong redefinition of method, which depends on used pointer
只是"wrong"按照你的意思,编译器是无法知道的
所写代码完全有效。虚拟调度是 opt-in,而你还没有 opted-in。
class A 将 print
定义为非虚拟,这是允许的。
这里没有警告,它是有效代码。你是说 A 的打印不是虚拟的,必须执行的功能是 A::print
我有简单的程序
#include <iostream>
using namespace std;
struct A
{
A(){}
void print(int i)
{
cout << "A::print: " << i << endl;
}
};
struct B : public A
{
B() : A() {}
virtual void print(int i) {};
};
struct C : public B
{
C() : B() {}
virtual void print(int i)
{
cout << "C::print: " << i << endl;
}
};
void main()
{
A* ca = new C();
C* cc = new C();
ca->print(1);
cc->print(1);
}
而且我不明白为什么我的编译器 (msvc2008) 没有显示任何警告。也许我不了解虚函数的机制?事实上,我们错误地重新定义了方法,这取决于使用的指针
In fact, we have wrong redefinition of method, which depends on used pointer
只是"wrong"按照你的意思,编译器是无法知道的
所写代码完全有效。虚拟调度是 opt-in,而你还没有 opted-in。
class A 将 print
定义为非虚拟,这是允许的。
这里没有警告,它是有效代码。你是说 A 的打印不是虚拟的,必须执行的功能是 A::print