gpt4 book ai didi

c++ - 继承类的意外转换

转载 作者:行者123 更新时间:2023-11-28 02:58:47 27 4
gpt4 key购买 nike

我正在尝试制作一种“集合”。此类需要接受从基类继承的所有类。

例如:

假设我们有一个名为“A”的基类,并且我们有很多其他类继承自这个类“A”。所以我们有继承自“A”的类“B”,继承自“A”的类“C”,等等,还有一个名为“集合”的类也继承自“A”。 “collection”类有一个“std::map”,其中使用“add”方法保存所有类,并可以使用“get”检索。

发生的事情是它以某种方式工作,但应用程序转换为“基类”而不是返回传递的类。

让我们转到代码(查看代码注释以了解输出):

这是工作代码:

#include <iostream>
#include <string>
#include <map>

class A
{
public:
virtual void saySomething()
{
std::cout << "Hello from A object" << std::endl;
}
};

class B : public A
{
public:
void saySomething()
{
std::cout << "Hello from B object" << std::endl;
}
};

class C : public A
{
void saySomething()
{
std::cout << "Hello from C object" << std::endl;
}
};

class Collection : public A
{
public:
void add(const std::string & key, A * value)
{
storage[key] = value;
}
A * get(const std::string & key)
{
return storage[key];
}
private:
std::map<std::string, A *> storage;
};

int main( int argc, char ** argv )
{

B * b = new B;
C * c = new C;
Collection * col = new Collection;
Collection * col2 = new Collection;
col->add("b", b); // works, because "b" inherits from "A" class.
col->add("c", c); // works, because "c" inherits from "A" class.
col->add("col2", col2); // watch this part...
col->get("b")->saySomething(); // works - Output: Hello from B object
col->get("c")->saySomething(); // works - Output: Hello from C object
return 0;

}

它有效,但是当我尝试检索“col2”并使用他的方法时...

col->get("col2")->add("b", b);
// output: error: 'class A' has no member named 'add'

如果我没记错的话,它需要工作,因为“get”方法返回对象,所以我有“col2”对象的方法,对吗?如果你回答是,我们的想法是一样的,我不知道发生了什么。在“b”和“c”对象上,它返回对象并且我有“saySomething”方法,但是当我尝试检索“col2”时,它将对象作为“A”对象,所以错误:

'class A' has no member named 'add'

如果我这样做,情况会变得更糟:

col->get("col2")->saySomething(); // output: Hello from A object

这个想法是,一个集合只接受从基类继承的类,也接受从同一基类继承的其他集合,就像递归一样。

最佳答案

C++ 有静态类型,所以当你有一个 A 类型的对象时 - 这就是你的 get 方法返回的 - 只有 A< 中声明的方法 可以使用。要在 get 的结果上调用 add,您需要使用 static_castdynamic_cast 进行转换,或者重新考虑您的类等级制度。为什么Collection需要继承自A? (回答你的最后一个问题,因为它是继承的,如果你调用 saySomething 它将调用 A 中声明的方法,因为 Collection 不提供它自己的覆盖)。

关于c++ - 继承类的意外转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21405593/

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