我们最为熟悉的“virtual destructor”行为就是在delete时的动态析构行为,但是又没有直接用指针或者引用来试验“多态析构”的经历呢?
下面就一起来试试吧^_^
class A{
public:
virtual ~A(){
cout << "A" << endl;
}
};
class B : public A{
public:
~B(){
cout << "B" << endl;
}
};
int main(int argc, char **argv){
B *pb = new A();
pb->~A(); //多态析构
return 0;
}
上面的pb->~A()中虽然有"A",但是仍然是多态调用,显示:
B
A
如果真想明确指定调用A的destructor,应该“pa->A::~A()”,加上限定符“A::”之后,编译器知道应该调用A的destrutor,而不会是多态调用了,此时显示:
A
同理,对于引用也是同样的:
int main(int argc, char **argv){
B b;
A &ra = b;
ra.~A(); //多态析构
cout << "-------------------" << endl;
}
上面的ra.~A()中虽然有"A",但是仍然是多态调用,显示:
B
A
-------------------
B
A
第二个"B(回车)A"是在main结尾处编译器为b对象添加的析构行为。
同样,如果真想明确指定调用A的destructor,应该“ra.A::~A();”,加上限定符“A::”之后,编译器知道应该调用A的destrutor,而不会是多态调用了,此时显示:
A
-------------------
B
A