returns 指向抽象 class 的 C++ 函数
C++ function that returns a pointer to an abstract class
函数 return 指向抽象 class 的指针有意义吗?
是的,它确实有意义。
这就像使用接口。
当然,这就是多态性的全部要点:传递并使用指向抽象 classes 的指针,而不管具体实现是什么。
除其他外,工厂模式通常 returns 指向抽象的指针 class。
有点。假设您有一个名为 AClass
的抽象 class,以及一个名为 CClass
的具体实现。您可以 return 一个指向 CClass
实例的指针,它可以是 AClass*
或 CClass*
类型。但是,由于您无法实例化抽象 class,因此您无法 return 指向抽象 class 的 实例 的指针。
但是,如果你returnAClass*
,你的客户端将只能访问AClass
的接口;如果他们想要访问 AClass
接口中未包含的 CClass
功能,他们需要将指针转换为 CClass*
.
是的,操纵指向抽象 class 的指针(或引用)是有意义的,以便将接口与实际实现分离并利用 polymorphism.
的好处
但请注意,如果函数负责分配返回的对象(某种 factory),请确保使用虚拟析构函数以便能够从抽象中正确删除对象 class指针:
class Base {
public:
virtual ~Base() {}
};
class Derived : public Base {
public:
~Derived() override {
// Do some important cleanup
}
};
Base* factory() {
return new Derived;
}
Base* base = factory();
base->~Base(); // calls Derived::~Derived
如果没有 Base
的虚拟析构函数,Derived
的析构函数就不会被调用。
函数 return 指向抽象 class 的指针有意义吗?
是的,它确实有意义。
这就像使用接口。
当然,这就是多态性的全部要点:传递并使用指向抽象 classes 的指针,而不管具体实现是什么。
除其他外,工厂模式通常 returns 指向抽象的指针 class。
有点。假设您有一个名为 AClass
的抽象 class,以及一个名为 CClass
的具体实现。您可以 return 一个指向 CClass
实例的指针,它可以是 AClass*
或 CClass*
类型。但是,由于您无法实例化抽象 class,因此您无法 return 指向抽象 class 的 实例 的指针。
但是,如果你returnAClass*
,你的客户端将只能访问AClass
的接口;如果他们想要访问 AClass
接口中未包含的 CClass
功能,他们需要将指针转换为 CClass*
.
是的,操纵指向抽象 class 的指针(或引用)是有意义的,以便将接口与实际实现分离并利用 polymorphism.
的好处但请注意,如果函数负责分配返回的对象(某种 factory),请确保使用虚拟析构函数以便能够从抽象中正确删除对象 class指针:
class Base {
public:
virtual ~Base() {}
};
class Derived : public Base {
public:
~Derived() override {
// Do some important cleanup
}
};
Base* factory() {
return new Derived;
}
Base* base = factory();
base->~Base(); // calls Derived::~Derived
如果没有 Base
的虚拟析构函数,Derived
的析构函数就不会被调用。