从接口访问具体类"this"指针
Access "this" pointer of concrete class from interface
在编写测试后,我确定接口中的this
指针不等于具体类的this
指针,这意味着我不能只在其上使用C样式转换。
class AbstractBase {...};
class AnInterface {
public:
AnInterface() {...} // need AbstractBase * here
~virtual AnInterface() {...} // and here
};
class Concrete : public AbstractBase, public AnInterface {};
我的接口需要一个基类指针,指向在构造函数和析构函数中继承它的具体类,以便处理与接口相关的注册和取消注册。
每个继承接口的具体对象都需要先继承抽象基类,它始终在布局中排在第一位。
对于构造函数来说,这并不是那么难,我可以在接口构造函数中添加一个指针并从具体类传递this
。但是析构函数没有任何参数,所以我在那里一无所知。
到目前为止,我想出的解决方案都有开销:
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_cast
并完成它,即使它非常重量级。如果我被困在一个不能选择 RTTI 的平台上,那么我会使用选项 2。
你的设计有一些缺陷。
您应该考虑从 Mixin 方面使用 CRTP,这样可以避免保留派生的具体内容的额外指针。
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; }
};
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 关于C++中具有多重继承"this"指针的说明
- Doees the 'this' 指针参与虚函数的多态行为
- 为什么成员函数内的"this"指针为空?
- "this"指针的值在对象的生存期内是否恒定?
- 如何将'this'指针传递给C++ WinAPI 线程?
- 无法"this"指针传递到另一个类并在 CPP 中调用该类的任何方法
- 'this'指针是否可以在 c++ 标头声明中使用?
- 为什么在通过引用返回运算符分配时取消引用'this'指针?
- 在类方法中使用 "this" 指针是否是一种好的做法?
- 为什么直接传递"this"指针来存档是一个错误,而另一个相同类型的指针是可以的?
- C++虚拟方法,不需要"this"指针 - 优化
- 指向成员函数签名的指针中缺少"this"指针
- 是否可以获取'this'指针的地址?
- 静态类成员不是与 this 指针没有关联吗?
- 为什么有必要将"this"指针作为"arg"参数传递给pthread_create
- 编译错误:2 个重载没有'this'指针的合法转换。使用结构
- 对象的"this"指针是否等于指向其(单个)基类的指针?
- Do=在lambda的捕获列表中捕获this指针
- 将"this"指针传递给析构函数中的其他类/函数