与简单地创建派生类指针相比,将基类绑定到派生类有什么优点?



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

每个都有不同的目的。

子指针

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++

最新更新