我覺得這很奇怪。在Sample_Base的ctor中,我調用了內部調用fun()的bar(),它是一個純虛函數。我得到了稱爲「純虛函數」的錯誤。這很好。現在,如果我直接從Sample_Base的ctor調用fun(),我不會得到那個錯誤。我在VC++ 2010 Beta 2和Ubuntu 9.10上的g ++ 4.4.1上嘗試過。我同意,除了純虛擬析構函數之外,爲純虛函數提供實現是沒有意義的。但是,我對這種行爲有點驚訝。純虛函數調用error
class Sample_Base
{
public:
Sample_Base()
{
bar();
// fun();
}
/* This is code does not throw any error.
Sample_Base()
{
fun();
}
*/
void bar()
{
fun();
}
virtual void fun() = 0;
virtual ~Sample_Base();
};
Sample_Base::~Sample_Base()
{
}
void Sample_Base::fun()
{
std::cout << "Sample_Base::fun\n";
}
class Sample_Derived : public Sample_Base
{
public:
Sample_Derived() : Sample_Base()
{
fun();
}
void fun()
{
std::cout << "Sample_Derived::fun\n";
}
~Sample_Derived()
{
}
};
[C++標準](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf)§10.4.6指出「虛擬調用純虛函數...正在創建的對象...未定義「。你能評論一下嗎?我會讀它直接調用'fun'也應該是未定義的(即使編譯器在這種特定情況下不會產生崩潰的程序)。或者這不是在這種情況下的虛擬調用(如果是這樣,爲什麼,我無法在標準中找到它)。 – Xlea 2015-04-23 13:13:59
@Xlea Charles Bailey在答案中指出了標準的正確部分。請注意,他當時正在使用C++ 03標準,因此現在章節號會有所不同,但這可能會引導您。 – Gorpik 2015-04-24 07:41:33