编译器的奇怪行为

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