【问题标题】:What's the advantage of binding a base class to a derived class as opposed to simply creating a derived class pointer?与简单地创建派生类指针相比,将基类绑定到派生类有什么好处?
【发布时间】:2020-05-23 17:33:12
【问题描述】:

请注意,在此示例中,我创建了一个派生类指针 (Laser* 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;
    }

【问题讨论】:

  • Base b = Derived(注意隐式转换)技术在您需要存储多个指针时可能很有用,所有这些指针都指向基派生类实例。我想不出一个有用的案例来创建Base b = new Derived()
  • 好吧,如果您将new 的结果分配给基类指针,您将无法在不触发未定义行为的情况下对其进行delete。要获得额外的功劳,您可以找出原因以及如何解决。
  • 感谢您的意见!现在有意义

标签: c++ oop pointers polymorphism


【解决方案1】:

每个人都有不同的目的。

子指针

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;
}


阅读更多:

Polymorphism C++

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2015-03-04
    • 2021-09-09
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多