请注意,在这个例子中,我创建了一个派生类指针(Laser* pLaser = new Laser),而不是像(Boat* 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;
}