dynamic_cast来解决实现难题
dynamic_cast to solve an implementation dilemma
这件事让我沮丧了一个多星期。我已经在这个网站上浏览了dynamic_casting的各种线程,但我仍然不确定实现这一点的最佳方式是什么
所以我有一个像这样的基类:
class baseClass
{
public:
class recordBase
{
public:
virtual ~recordBase(){}
};
virtual ~baseClass() {};
virtual bool Allocate( int size,
recordBase *outRecord) = 0 ;
virtual bool Free(recordBase *allocRecord) = 0;
} ;
它有两个派生类。一个派生的A类,类似于…
class DerivedA : public baseClass
{
public:
class derivedRecordA : public baseClass::recordBase
{
public:
inline ~derivedRecordA(){} ;
someClass *obj1 ;
}
bool Allocate(int size,
baseClass::recordBase *outRecord);
bool Free(baseClass::recordBase *allocRecord) ;
}
我有一个类似的派生类"DerivedB",它有自己的dervied recordBase以及Allocate和Free函数的实现。
现在,我终于有了一个使用上述基类的类C。
class C
{
public:
baseClass *allocator ;
Allocate(int size) ;
Free(void) ;
}
现在是我的问题,基于一些条件,类C要么存储一个derivedA的分配器,要么存储一一个deriedB的分配器。
C类的分配函数看起来像这个
C::Allocate(int size)
{
//condition where DerivedA is needed
DerivedA::derivedRecordA recObj ;
if(allocator->Allocate(size, &recObj))
{
return true;
}
else return false ;
}
现在的问题是,我被迫在DerivedA::Allocate实现中使用动态铸造,如下所示:
DerivedA::Allocate(int size, baseClass:recordBase *outRecord)
{
DerivedA::derivedRecordA *rec = dynamic_cast< DerivedA::derivedRecordA *>(outRecord) ;
//allocate mem and store info in 'rec'
return true ;
}
如何避免在此处使用dynamic_casting。这个问题有更清洁的解决方案吗?
基类设计存在问题,这就是为什么在派生级别存在实现问题。
如果我有一个指向baseClass
实例的指针(无论它必须是什么实际类型),那么Allocate
方法的隐含约定是,我可以传递一个指向任何类型的baseClass::recordBase
的指针,一切都应该正常。
如果派生类覆盖了函数,那么它们不应该缩小函数用户的函数需求。这实际上意味着它们提供的覆盖不满足基类函数的接口。如果他们需要这样做,那么他们应该提供一个具有合适接口的不同功能。
话虽如此,我本希望Allocate
函数能够分配一个新对象。在这种情况下,您可以重写并返回一个指向专门化的指针(这被称为协变返回类型)。例如,您可以覆盖:
virtual recordBase* Allocate(int size) = 0;
带有
virtual derivedRecordA* Allocate(int size);
提供size
不应该是数组大小,并且您没有试图返回指向派生对象数组的指针,这对基类接口的用户来说也是有问题的。
你真的需要用基类函数的契约和预期行为来扩展你的问题,这些重写应该是为了得到更好的答案。
有一个更干净的解决方案,它在baseRecord上使用一个虚拟函数,该函数被适当地重写。
如果这不令人满意,则检查typeid
并在成功时使用static_cast
可能比dynamic_cast
更快,即使它是糟糕的耦合。
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- dynamic_cast来解决实现难题