我已經編寫了使用三種類型的此測試代碼:struct One
是一個沒有虛擬成員的普通類型,struct Two : One
有一個純虛函數和一個虛析構函數,並且struct Three : Two
實現Two
的接口。從非虛擬父類虛擬類繼承的正確方式
#include <iostream>
struct One
{
~One() {
std::cout << "~One()\n";
}
};
struct Two : One
{
virtual ~Two() {
std::cout << "~Two()\n";
}
virtual void test() = 0;
};
struct Three : Two
{
virtual ~Three() {
std::cout << "~Three()\n";
}
virtual void test() {
std::cout << "Three::test()\n";
}
};
int main()
{
Two* two = new Three;
two->test();
One* one = two;
delete one;
}
不出所料,the output was此:
三個::測試()
〜一()
有沒有什麼辦法比讓每一個虛擬析構函數來解決這個其他?或者程序員是否應該小心不要陷入這種情況?我覺得奇怪,編譯時沒有警告。
一個簡單的解決方法:使用來自'One'的私有或受保護的繼承,並通過聲明公開功能。 – Xeo 2012-01-07 11:39:51