【发布时间】:2015-08-27 02:41:20
【问题描述】:
我尝试“修复”this answer 中的示例,以演示如何调用纯虚函数。
#include <iostream>
using namespace std;
class A
{
int id;
public:
A(int i): id(i) {}
int callFoo() { return foo(); }
virtual int foo() = 0;
};
class B: public A
{
public:
B(): A(callFoo()) {}
int foo() { return 3; }
};
int main() {
B b; // <-- this should call a pure virtual function
cout << b.callFoo() << endl;
return 0;
}
但我没有收到运行时错误here (with C++ 4.9.2),而是输出 3。我在 Borland C++ 5.6.4 上尝试了相同的操作,但我遇到了访问冲突。我认为foo()在基类的构造函数的调用中应该是纯虚的。
谁错了?我应该尝试更多的编译器吗?我对虚函数的理解正确吗?
【问题讨论】:
-
我不会使用 Borland C++ 的测试结果来查看代码的 sn-p 是否有效和/或是否符合标准;)
-
@CoryKramer 虚拟功能已经使用了几十年。
-
我知道,我在对仍在使用 Borland IDE 的人发表厚颜无耻的评论
-
;-) 仅当我必须时,可悲的是,情况仍然如此。
-
我认为你在以未定义的行为跳舞。如果您查看this example,我会在将
cout语句添加到A::callFoo()时遇到分段错误。如果我们删除cout语句,那么它会编译并工作。我不得不猜测,当指针保持对齐时,最小的例子恰好可以工作。
标签: c++ pure-virtual