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

Posted

技术标签:

【中文标题】与简单地创建派生类指针相比,将基类绑定到派生类有啥好处?【英文标题】: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。要获得额外的功劳,您可以找出原因以及如何解决。 感谢您的意见!现在有意义 【参考方案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++

【讨论】:

以上是关于与简单地创建派生类指针相比,将基类绑定到派生类有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以将基类的私有成员继承到派生类的公共成员中吗?

将基类的对象传递给派生类的引用函数

无法将基类(数据协定)转换为派生类

如果基类指针不能访问派生类成员函数,那么多态有啥方便呢?

将基类传递给函数而不是派生一个

为啥以及何时使用多态性将基类指向 C++ 中的派生类 [重复]