【发布时间】:2014-11-01 14:25:17
【问题描述】:
考虑以下代码:
#include <iostream>
using namespace std;
class A
{
public:
virtual void f() = 0;
A(){f();}
};
void A::f() {
cout<<"A"<<endl;
}
class B:public A{
public:
void f(){cout<<"B"<<endl;}
};
int main()
{
B b;
}
在这种情况下,我直接从构造函数调用虚函数并得到编译器警告:
警告:从构造函数调用的抽象虚拟 'virtual void A::f()'。
但它执行时没有终止并打印 A。
如果我像这样包装函数的调用:
class A
{
public:
virtual void f() = 0;
A(){g();}
void g(){f();}
};
void A::f(){cout<<"A"<<endl;}
class B:public A{
public:
void f(){cout<<"B"<<endl;}
};
int main()
{
B b;
}
编译器在编译期间不输出任何警告,但在运行时崩溃并显示以下消息:
pure virtual method called
terminate called without active exception
Abort
谁能解释这两种情况的行为?
【问题讨论】:
标签: c++ inheritance compilation virtual-functions pure-virtual