C++ “访问”;这";来自接口的具体类的指针

C++ “访问”;这";来自接口的具体类的指针,c++,interface,base-class,concreteclass,C++,Interface,Base Class,Concreteclass,在编写测试之后,我确定接口中的this指针不等于具体类的this指针,这意味着我不能在其上使用C样式的转换 class AbstractBase {...}; class AnInterface { public: AnInterface() {...} // need AbstractBase * here ~virtual AnInterface() {...} // and here }; class Concrete : public AbstractBase, p

在编写测试之后,我确定接口中的
this
指针不等于具体类的
this
指针,这意味着我不能在其上使用C样式的转换

class AbstractBase {...};

class AnInterface {
public:
    AnInterface() {...} // need AbstractBase * here 
    ~virtual AnInterface() {...} // and here
};

class Concrete : public AbstractBase, public AnInterface {};
我的接口需要一个基类指针,指向在构造函数和析构函数中继承它的具体类,以便处理与接口相关的注册和注销

每个继承接口的具体对象都需要首先继承抽象基类,它在布局中始终是第一个

对于构造函数来说,这并不难,我可以在接口构造函数中添加一个指针,并从具体类传递
这个
。但是析构函数没有任何参数,所以我对它一无所知

到目前为止,我提出的解决方案都有开销:

1-将指针存储在要在析构函数中使用的接口中-添加一个指针值的内存开销

class AnInterface {
public:
    AnInterface(AbstractBase * ap) {...}
    ~virtual AnInterface() {...} // and here
private:
    AbstractBase * aPtr;
};

...
Concrete() : AnInterface(this) {}
2-在接口中创建一个抽象方法,并实现它以在具体类中返回
this
-增加了虚拟调用的间接寻址开销

class AnInterface {
    virtual AbstractBase * getPtr() = 0;
};

class Concrete : public AbstractBase, public AnInterface {
    AbstractBase * getPtr() { return this; }
};
3-
dynamic_cast
更糟糕


有没有更有效的方法来实现这一点?

IMO如果真的需要在基类和接口之间进行解耦,那么解决方案1和解决方案2都有可容忍的开销,当然在当代硬件上没有什么问题

但是,既然您说接口设计为与基类中提供的功能一起工作,那么解耦可能不是一件好事


我的意思是,如果问题在于继承多个接口,而这些接口都继承了基类,。

您所有的关注点似乎都是微观优化。假设您真的无法将接口与实现分离开来(在这种情况下,您首先为什么要使用接口?),我只会使用
dynamic\u cast
并完成它,即使它相当重。如果我被困在一个不能选择RTTI的平台上,那么我会使用选项2。

您的设计有一些缺陷

你应该考虑使用,这样可以节省你保存一个具体的派生指针。< /P>

template<typename Derived>
class AnInterface {
public:
    AnInterface() {
       Derived* derived = static_cast<Derived*>(this);
       AbstractBase* abstractBase = static_cast<AbstractBase*>(derived);
    } // have AbstractBase * here 
    ~virtual AnInterface() {...} // and here
};

class Concrete 
: public virtual AbstractBase
, public AnInterface<Concrete> {
    AbstractBase * getPtr() { return this; }
};
模板
类A接口{
公众:
接口(){
派生*派生=静态_转换(此);
AbstractBase*AbstractBase=静态转换(派生);
}//这里有AbstractBase*
~virtual-an接口(){…}//在这里
};
等级混凝土
:公共虚拟数据库
,公共接口{
AbstractBase*getPtr(){返回此;}
};

您说过,“我的接口需要一个基类指针,指向继承它的具体类”。这似乎是设计中的一个缺陷。@RSahu-接口设计用于处理抽象基类,但与设计分离。我不想在接口中继承基类,因为如果有多个接口,它会变得杂乱无章。那么从AbstractBase派生接口?@berkus-这就是我刚才说的。它不是唯一一个与抽象基一起工作的接口,因此如果一个具体类继承了2个这样的接口,我将在继承链中有2个抽象基…@Bathsheba-它们不必是,如果它们是,那就太好了,然后我可以C转换指针并完成它。感谢您提到CRTP: