gpt4 book ai didi

c++ - 自由函数和继承

转载 作者:行者123 更新时间:2023-11-28 03:26:42 25 4
gpt4 key购买 nike

我正在尝试使用两个类和一个自由函数进行基本操作。首先我有两个类:

struct BASE{
BASE(int a = 0):a_(a){};
virtual ~BASE(){};
virtual void foo(){std::cout << "BASE " << std::endl;}
int a_;
};

struct DERIVED: public BASE{
DERIVED():BASE(){};
void foo(){std::cout << "DERIVED " << std::endl;}
};

然后我填充一个 std::vector(或 boost::ptr_vector)

std::vector<BASE* > vec;    
vec.push_back( new BASE(2));
vec.push_back( new DERIVED);

如果我调用我的函数 foo,没有 pb 虚拟的东西运行良好,但是如果我创建两个免费功能:

void foo(BASE*   a, DERIVED*   b){
std::cout << " mix base/derived " << std::endl;
}

void foo(BASE* a, BASE* b){
std::cout << " full base " << std::endl;
}

如果我这样做

foo(vec[0], vec[1]); //failed

我会收到消息

full base

这是合乎逻辑的,因为我有 BASE* vector ,但它是否存在获得对我的免费功能的良好调用?我需要继承,所以我不能真正分开这两个类,因为我必须填满这个容器

此外,最后我的 vector 将被随机填充,所以我无法提前知道如何正确转换。

最佳答案

获得解决方法的最简单(也是最快)方法是再引入一个虚函数来唯一标识派生类(使用 intenum 值或 typeid )。所以稍后您可能会调用它并意识到您在 BASE* 后面有什么确切的派生类(或者可能是基类),然后对该类型执行 dynamic_cast

您没有详细说明您正在尝试解决什么问题...如果您想实现 Double Dispatch,请确保您已经对现有解决方案进行了完整的研究。 (或某种)...

但通常,如果您需要 dynamic_cast,这意味着您的设计(领域的 OOP 模型)有问题......

关于c++ - 自由函数和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13724290/

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