純枠仮想デスストラクタの「ここです」とコメントしてある部分なのですが純枠仮想デスストラクタにする意味を教えてほしいです、普通のデスストラクタにして実行してみましたがこの場合は効果が同じなので利点を理解できません。
1.利点を教えてほしいです
2、純枠仮想関数に定義を書くと挙動がどう変わるのか知りたいです。
3、参考書に、「あるメンバ関数から、そのクラス内で本体が定義されてない純粋仮想関数を呼び出す式がコンパイルエラーとなることはない」とありますが。どのようなことなのか教えてほしいです。

        #include <iostream>
        #include "conio.h"
        #include <string>
        //using namespace std;


        class Animal {
        private:
            std::string name;
        public:

            virtual ~Animal() = 0;//コードを編集しました。
            Animal(const std::string& n) : name(n) { }

            virtual void bark() = 0;

            virtual std::string to_string() = 0;

            std::string get_name() {
                return name;
            }

            void introduce() {
                std::cout << to_string() + "だ";
                bark();
                std::cout << "\n";
            }

        };

        inline Animal::~Animal() { }//ここです。

        class Dog : public Animal {
        private:
            std::string type;
        public:
            Dog(const std::string& n, const std::string& t) : Animal(n), type(t) {  }

            virtual void bark() { std::cout<< "ワンワン!!"; }

            virtual std::string to_string() {
                return type + "の" + get_name();
            }

        };

        class Cat : public Animal {
        private:
            std::string fav;
        public:

            Cat(const std::string& n, const std::string& f) : Animal(n),fav(f){ }

            virtual void bark() {
                std::cout << "にゃーん";
            }

            virtual std::string to_string() {
                return fav + "が好きな" + get_name();
            }


        };


        int main() {

            int i = 0;
            Animal *p[] = {
                new Dog("dog_A","D_a"),
                new Cat("Cat_a","C_a"),
                new Dog("dog_B","D_b"),
            };

            for (i = 0; i < sizeof(p) / sizeof(p[0]); i++) {
                p[i]->introduce();
            }

            i = 0;
            for (i; i < sizeof(p) / sizeof(p[0]); i++) {
                delete p[i];
            }



            _getch();
            return 0;
        }