gpt4 book ai didi

c++ - 创建一个接口(interface)和一个具体类并在 vector 中使用它们会导致调用方法时出现奇怪的行为

转载 作者:行者123 更新时间:2023-11-30 05:04:11 25 4
gpt4 key购买 nike

我一直在尝试用 C++ 实现一个接口(interface)类(抽象类)和一些基于它的具体类。

它似乎工作得很好,直到我将它们放入 shared_ptr<Interface> 的 vector 中并尝试调用元素上的方法。

没有参数的方法按预期工作(即调用具体类方法),但对于有参数的方法,调用接口(interface)方法。

通过代码可能更容易解释,所以这里是一个展示它的最小示例。

#include <iostream>
#include <memory>
#include <vector>

class Interface{
public:
virtual ~Interface() = 0;
virtual void foo(){
std::cout << "Interface::foo" << std::endl;
}
virtual void bar(std::shared_ptr< Interface >){
std::cout << "Interface::bar" << std::endl;
}
};
Interface::~Interface(){}

class Concrete: public Interface{
public:
virtual void foo(){
std::cout << "Concrete::foo" << std::endl;
}
virtual void bar(std::shared_ptr< Concrete >){
std::cout << "Concrete::bar" << std::endl;
}
};

int main(){
std::shared_ptr< Concrete > a = std::make_shared< Concrete >();
a->foo();
a->bar(a);
std::cout << std::endl;

std::vector< std::shared_ptr< Interface > > vec{};
vec.push_back( a );
vec[0]->foo();
vec[0]->bar(a);

return 0;
}

输出:

Concrete::foo
Concrete::bar

Concrete::foo
Interface::bar

我做错了什么?顺便说一句,即使我使用带有常规指针的数组也会发生同样的情况

最佳答案

虚空条(std::shared_ptr<具体>)

与基类不匹配。

虚空条(std::shared_ptr< Interface >)

为了获得正确的多态行为,您需要修改具体的多态行为以具有相同的签名。修改为 std::shared_ptr 。如果您使用的是 C++11,则可以使用 override 关键字使您的意图明确 http://en.cppreference.com/w/cpp/language/override .如果您没有覆盖现有的虚拟方法,编译器将向您通知错误。

关于c++ - 创建一个接口(interface)和一个具体类并在 vector 中使用它们会导致调用方法时出现奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49035194/

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