Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 派生类中的基类参数';方法_C++_Class_Inheritance - Fatal编程技术网

C++ 派生类中的基类参数';方法

C++ 派生类中的基类参数';方法,c++,class,inheritance,C++,Class,Inheritance,这是我的密码: 类基 { 虚拟共享\u ptr clone()常量=0; }; A类:公共基地 { 公众: A(常量字符串和str){ _str=str; } 共享\u ptr clone()常量 { 在本教程之后返回make_shared,但似乎出现了一个错误“调用'A::A(const B&')时没有匹配的函数” 我如何使用类A和类B调用此函数 std::shared_ptr和std::shared_ptr都可以转换为std::shared_ptr,这是函数所期望的,因此提供共享指针是可行的

这是我的密码:

类基
{
虚拟共享\u ptr clone()常量=0;
};
A类:公共基地
{
公众:
A(常量字符串和str){
_str=str;
}
共享\u ptr clone()常量
{
在本教程之后返回make_shared,但似乎出现了一个错误“调用'A::A(const B&')时没有匹配的函数”

我如何使用类A和类B调用此函数

std::shared_ptr
std::shared_ptr
都可以转换为
std::shared_ptr
,这是函数所期望的,因此提供共享指针是可行的

test.AddToStorage("a", std::make_shared<A>("test1"));
test.AddToStorage("b", std::make_shared<A>("test2"));
test.AddToStorage("c", std::make_shared<B>());
test.AddToStorage(“a”,std::make_shared(“test1”);
测试。添加存储(“b”,标准::使共享(“测试2”);
test.AddToStorage(“c”,std::make_shared());
当我以后访问U存储(map)时,如何区分A类和B类


为了区分它们,您需要在
Base
中有一个虚拟函数,并且(理想情况下)在
A
B
中重写它以执行不同的操作。使用指针管理类层次结构而不使用任何虚拟函数是相当可疑的,因此您可能至少应该有一个层次结构。

以添加到另一个答案中。如果您编译代码:

test.AddToStorage("c", B());
这些错误非常有用:

no viable conversion from 'B' to 'std::shared_ptr<Base>'
但是,由于
共享的构造函数在这里

标记为显式。因此,唯一的解决方法是执行以下操作

test.AddToStorage("c", std::make_shared<B>());
后来从一个

shared_ptr<A> pA;
std::cout<<type_names[std::type_index(typeid(*pA))]<<'\n';
shared_ptr pA;

这听起来可能很愚蠢,但有没有办法只改变方法(而不是第二个代码片段)?我听说过克隆模式,但无法让它们正常工作。@Ventuaer要保留第二个代码段,该方法必须采用
Base&
而不是
shared\u ptr
,但要将
val
对象正确地存储在
映射中,您需要实现克隆。如果您在然后,你需要编辑你的问题,以显示你尝试过的对你不起作用的内容。@Remy Lebeau不得不编辑它,不幸的是:(@Ventuaer FYI,
const Base&val
也会起作用。但是不管怎样,
\u storage[key]=val.clone();
都会起作用。真正的问题是你的
clone()
方法试图调用您根本没有实现的复制构造函数。此外,显示的代码与您声称得到的错误消息不匹配,因为没有从
B
对象构造
对象。拥有虚拟析构函数就足够了(通常应用于任何类型的多态层次结构)。至于区分,虚拟方法更可取,但也可以使用,或者在
共享的情况下。
std::unordered_map<std::type_index, std::string> type_names;
type_names[std::type_index(typeid(A))] = "A";
shared_ptr<A> pA;
std::cout<<type_names[std::type_index(typeid(*pA))]<<'\n';