与简单地创建一个派生类指针相比,将基类绑定到派生类有什么好处?

问题描述 投票:0回答:1

请注意,在这个例子中,我创建了一个派生类指针(Laser* pLaser = new Laser),而不是像(Boat* pLaser = new Laser)这样的基类指针。创建基类指针有什么好处吗?谢谢!请注意,在这个例子中,我创建了一个基类指针,而不是像(Boat* pLaser = new Laser)这样的基类指针。

   #include <iostream>
    using namespace std;

    class Boat      
    {
        protected:
         int length;

        public:
         int getLength() { return length; }
         virtual void Model() = 0;
    };

    class Sailboat : public Boat        
    {
        protected:
         int mast;

        public:
         int getMast() { return mast; }
         virtual void Boom() = 0;
    };

    class Laser : public Sailboat       
    {
        public:
         Laser() { mast = 19; length = 35; }    
         ~Laser();                              

         void Model() { cout << "Laser Classic" << endl; }  
         void Boom() { cout << "Boom: 14 ft" << endl; }
    };


    int main()
    {
        Laser* pLaser = new Laser;      

        pLaser -> Model();
        cout << "Length: " << pLaser -> getLength() << "ft" << endl;
        cout << "Height: " << pLaser -> getMast() << "ft" << endl;
        pLaser -> Boom();

        return 0;
    }
c++ oop pointers polymorphism
1个回答
0
投票

每一个指针都有不同的用途。

子指针

Laser* pLaser = new Laser 目的是简单地对这个类型使用动态分配,有时是为了与其他线程进程共享这个数据。通常在C++中你不必使用它,你通常在堆栈上分配这个类型。

父指针

Boat* pLaser = new Laser 这是一个不同的多态性的故事。如果你想存储不同的类型,实现相同的接口,你就可以 来使用这个表单(通常是用智能指针,但还是同样的想法)。例如,假设你想让一个容器(如 std::vector)同时包含 SailboatLaser. 使用这个表单,你可以做这样的事情。

std::vector<Boat*> vec = {new Laser(), new Sailboat()};
for (auto &e : vec) {
    std::cout << e->getLength() << std::endl; 
}

正如我提到的, 有时你必须使用这个表格, 那些时候你必须在基类中至少有一个纯虚拟函数. 在这种情况下,你不能在基类的堆栈中创建一个对象(由于类型不完整)。举个例子。

class Base {
public:
    virtual int compare(int, int) = 0;
};

class Derived : public Base {
public:
    int compare(int a, int b) {
        return a - b;
    }
};

int main() {
    //Base b; // Compilation error
    Derived c; // OK
    std::shared_ptr<Base> base_pointer = std::make_shared<Derived>(); // OK
    return EXIT_SUCCESS;
}

阅读更多关于:

多态性 C++

© www.soinside.com 2019 - 2024. All rights reserved.