编译器的奇怪行为

时间:2016-01-18 10:45:10

标签: c++ virtual-functions

我有简单的程序

#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)没有显示任何警告。也许我不懂虚函数的机制?实际上,我们错误地重新定义了方法,这取决于使用的指针

2 个答案:

答案 0 :(得分:1)

  

实际上,我们错误地重新定义了方法,这取决于使用的指针

它只是&#34;错误&#34;根据你的意图,编译器无法知道。

编写的代码完全有效。虚拟发货是选择加入的,您还没有选择加入。

答案 1 :(得分:1)

A类将print定义为非虚拟且允许的。 这里没有警告,它是有效的代码。您说A的打印不是虚拟的,必须执行的功能是A::print