免责声明:我是一个完整的C ++初学者,如果对这个问题有类似的答案,请指导我,因为我可能已经错过了,不太了解理论
所以我正在查看一些c ++代码,我找到了类似的东西:
shared_ptr<anObjectsInterface>
让我想知道,怎么会有一个指向界面的指针?当然指针指向内存中的对象,或者我在这里读错了。
谢谢
答案 0 :(得分:1)
显然,指针指向内存位置的对象。在这种情况下,它应该指向一个实现特定接口的对象。
答案 1 :(得分:1)
不要忘记,在C ++对象模型中,对象由子对象组成,其中包括基础子对象和成员子对象。一个抽象类,或者更一般地说是一个&#34;接口&#34;正如你可能称之为,它本身可能不是一个完整的对象,但它可能是一个更完整的对象的子对象。宾语。指针可以指向任意对象,包括子对象。
示意性地:
+-- class Der --------------------------------------+
| +---------+ +---------+ +----------+ +---------+ |
| |*********| |*********| |**********| |*********| |
| +- int x -+ +- Base1 -+ +- bool b -+ +- Base2 -+ |
+---------------------------------------------------+
^ ^ ^
| | |
| +-- &a.x +-- static_cast<Base1*>(&x)
&a;
我们在这里使用:
struct Base1 { virtual void f() = 0; };
struct Base2 {};
struct Der : Base2, Base1 { int x; bool b; void f() override {} };
Der a;
虚函数调度机制的全部目的是你可以在一个可能不是最有派生的对象上调用(虚拟)成员函数,但是我们将在运行时查找 是否我们是更多派生对象的子对象,我们将使用 对象的类的函数实现。
答案 2 :(得分:0)
你是对的,这个shared_ptr将始终为空或指向具体对象。但是shared_ptr不知道该对象的特定类型;所有它知道的是它指向实现的任何对象(直接或间接地从anObjectsInterface类派生)。
答案 3 :(得分:0)
anObjectsInterface
很可能是一个完全出于以下目的而创建的抽象基类:为了传递一个对象而不必指定哪个类实际实现了抽象类的方法。
一个最小的例子(使用你提供的命名)就是这样的 - 你可以在任何提到类层次结构和/或虚函数的教程中找到大量的这些:
#include <memory>
struct anObjectsInterface {
virtual int doStuff() const = 0;
};
struct anImplementation : public anObjectsInterface {
int doStuff() const override {
return 5;
}
};
void doStuffWithObject(const std::shared_ptr<anObjectsInterface>& x) {
x->doStuff();
}
int main() {
auto object = std::make_shared<anImplementation>();
doStuffWithObject(object);
}
您会看到doStuffWithObject
需要std::shared_ptr<anObjectsInterface>
,因此不知道此shared_ptr
实际指向anImplementation
类的实例。
另外,请注意在这样的场景中使用shared_ptr
是不必要的:unique_ptr
会更合适。
答案 4 :(得分:0)
在C ++中,“interface”对于仅包含或主要是纯虚函数的类来说只是一个非技术术语。该接口的实现将继承接口类,并且接口类在整个对象中具有“真实”基类子对象。基类子对象有一个地址并像任何其他对象一样占用内存,所以我们可以有一个指向它的指针。