与简单地创建派生类指针相比,将基类绑定到派生类有啥好处?
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
)同时包含Sailboat
和Laser
。使用此表单,您可以执行以下操作:
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++
【讨论】:
以上是关于与简单地创建派生类指针相比,将基类绑定到派生类有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章