2010-08-17 64 views
0

我创建了一个父类,它调用它自己的虚拟成员。但是这个虚拟成员被子类覆盖。C++从父虚拟成员调用子虚拟成员

class Parent { 
public: 
    void doSomething() { 
     doVirtual(); 
    } 
protected: 
    virtual void doVirtual() {} 
}; 

class Child : public Parent { 
protected: 
    virtual void doVirtual() {} 
}; 

Parent *c = new Child(); 
c->doSomething(); 

而且与Visual Studio 2008编译它,我的问题是: 当我执行从IDE代码(开始调试),它调用子方法,但是当我直接运行可执行文件,它调用父类的方法。我在这里做错了什么?

+0

VS 2010只在两种模式下调用子方法(doVirtual)(如预期) – Chubsdad 2010-08-17 04:58:13

+0

我得到了与chubsdad相同的结果,VS 2010只在两种模式下调用子方法。 – muddybruin 2010-08-17 05:01:12

+0

好的,谢谢大家,我会试试vs 2010。我怀疑bug存在于我的代码中。 – flamemyst 2010-08-17 05:13:08

回答

0

如果这些函数不做任何事情(或者完全相同的事情),你怎么知道当你直接运行可执行文件时它会调用父方法?

有两个函数实际上做了一些不同的事情 - 编译器可能会'合并'功能,如果它们是相同的(尽管我希望在调试版本中不太可能发生)。

如果此答案没有意义,请发布精确的(复制粘贴)可编译片段,以便我们可以确切地看到发生了什么。

+0

我很抱歉,但我放在这里的是最简单的实际代码形式。在子代方法中有代码,为了确保,我在那里放了几个std :: cout。从调试器(即使在发布模式)启动时,它们会被调用,但如果直接从可执行文件(发布模式)运行,则会失败。 只有当我将其转回到子指针时,它才会起作用。 – flamemyst 2010-08-17 04:51:00

+0

对不起,我不能将它简化为简单的案例,或重播它在另一个项目中的不当行为,也许一个错误正在我的代码中蔓延。 – flamemyst 2010-08-17 05:11:17

+1

@ user422420:我建议试着彻底清理你的中间输出(包括预编译头文件)并重建,看看是否有帮助。 – 2010-08-17 05:26:49