我们最为熟悉的“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",但是仍然是多态调用,显示:BA如果真想明确指定调用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",但是仍然是多态调用,显示:BA-------------------BA第二个"B(回车)A"是在main结尾处编译器为b对象添加的析构行为。同样,如果真想明确指定调用A的destructor,应该“ra.A::~A();”,加上限定符“A::”之后,编译器知道应该调用A的destrutor,而不会是多态调用了,此时显示:A-------------------BA