gpt4 book ai didi

c++ - 在派生类中实现虚函数时避免dynamic_cast

转载 作者:太空狗 更新时间:2023-10-29 21:30:14 28 4
gpt4 key购买 nike

这是一些示例代码,解释了我要实现的目标。

基本上,我有一个算法依赖于类中可用的一些基本操作。我已经在纯抽象基类中定义了这些操作。我想将该算法应用于各种对象,这些对象通过为特定对象派生类来提供这些操作。

但是,就这些操作而言,不同的派生对象彼此不兼容。我的问题是我是否可以避免使用 RTTI 来确保例如 bool derived2::identical(const base* other2)、断言(或其他退出机制)其中 other2 不是 derived2 类型。

一种替代方法是在特定派生对象上对函数算法进行模板化,但这意味着它的实现必须存在于头文件中,我不想这样做,因为 1) 更改算法代码以进行测试目的可能导致重新编译大部分代码 2) 算法的实现将在 header 中公开,而不是很好地存在于对最终用户隐藏的源文件中。

头文件

#include <list>

class base
{
public:
virtual float difference(const base*) const = 0;
virtual bool identical(const base*) const = 0;
};


class derived1 : public base
{
public:
float difference(const base* other1) const
{
// other1 has to be of type derived1
if(typeid(other1) == typeid(this))
{
// process ...
}
else
{
assert(0);
}
return 1;
}

bool identical(const base* other1) const
{
// other1 has to be of type derived1
if(typeid(other1) == typeid(this))
{
// compare...
}
else
{
assert(0);
}
return true;
}
};


class derived2 : public base
{
public:
float difference(const base* other2) const
{
// process ...
// other2 has to be of type derived2
return 2;
}

bool identical(const base* other2) const
{
// do comparison
// derived1 and derived2 cannot be compared
return true;
}
};

// Declaration
int algorithm(std::list<base*>& members);

算法源文件的实现

#include "header_file_containing_base"
int algorithm(std::list<base*>& members)
{
// This function only relies on the interface defined in base
// process members;

return 1;
}

主程序

int main()
{
// Create lists of derived1 and derived2
// Run algorithm on these lists
}

最佳答案

你可以使用双重调度(http://en.wikipedia.org/wiki/Double_dispatch)

关于c++ - 在派生类中实现虚函数时避免dynamic_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3200964/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com