请注意,在此示例中,我创建了一个派生类指针(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
( 包括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;
}
阅读更多关于:
多态性C++