【发布时间】:2015-08-05 14:18:40
【问题描述】:
考虑以下 2 个程序。
#include <iostream>
using std::cout;
class Base {
public:
virtual void f()=0;
void g() {
f();
}
virtual ~Base() { }
};
class Derived : public Base
{
public:
void f() {
cout<<"Derived::f() is called\n";
}
~Derived() {}
};
class Derived1 : public Base
{
public:
void f() {
cout<<"Derived1::f() is called\n";
}
~Derived1() { }
};
int main() {
Derived1 d;
Base& b=d;
b.g();
b.f();
}
编译和运行良好并给出预期的结果..
#include <iostream>
using std::cout;
class Base {
public:
virtual void f()=0;
Base() {
f(); // oops,error can't call from ctor & dtor
}
};
class Derived : public Base
{
public:
void f() {
std::cout<<"Derived::f() is called\n";
}
};
int main() { Derived d; Base& b=d; b.f(); }
上述程序编译失败。 为什么允许从声明纯虚函数的同一个类的成员函数中调用纯虚函数?这样做很好还是因为派生类仍然不提供纯虚函数的实现而导致未定义的行为?为什么不能从同一个类的构造函数和析构函数中调用纯虚函数?我知道派生类构造函数可以调用基类的纯虚函数。 C++ 标准对此有何规定?
【问题讨论】:
-
@vsoftco:该链接讨论了不同的主题。
-
第二个答案解决的问题非常相似,不一样,这就是我说相关的原因。
标签: c++ undefined-behavior pure-virtual