多态性:代码中的复杂性错误.需要一个解释
Polymorphism: Compliation Error in the code.Need an Explanation
下面的代码给出的编译错误如下:第1行"无法从'Cloneable*'转换为'AClass*'"。据我所知,它涉及编译时和运行时多态性的概念。但我没有具体的理由。请帮助。
struct Cloneable
{
virtual Cloneable* clone()
{
cout << "Cloneable";
return new Cloneable;
}
virtual ~Cloneable() {}
};
struct AClass : public Cloneable
{
virtual AClass* clone()
{
cout << "AClass";
return new AClass;
}
};
int main()
{
Cloneable* s1 = new AClass;
AClass* s2 = s1->clone(); //Line 1
return 0;
}
基本上,当您将新的acclass *存储在基类指针中时,调用clone的结果将是Cloneable*,它需要向下转换为acclass *,这可能并不总是安全的。因此编译器需要一个dynamic_cast ()
虽然可以通过cast让它"工作",但你这样做是非常危险的。您忘记删除两个动态分配的对象。像这样"隐藏动态内存分配"也不是一个好主意,特别是你不会在任何地方删除它。使用std::unique_ptr或std::shared_ptr或者只是在堆栈上分配对象要容易得多。
编辑:我为没有直接回答而道歉:
AClass* s2 = dynamic_cast<AClass*>(s1->clone());
您在Cloneable
指针上调用clone()
。这个方法返回一个Cloneable*
,所以您需要这样做:
Cloneable* s2 = s1->clone();
将实例化一个AClass
。这是使用克隆习语的标准方法。如果您正确地使用多态性,那么如果您有Cloneable*
或AClass*
应该无关紧要。因此,您通常也会从AClass::clone()
返回Cloneable*
。当然,最好是返回一个智能指针。
struct AClass
{
virtual std::unique_ptr<Cloneable> clone();
};
struct AClass : public Cloneable
{
virtual std::unique_ptr<Cloneable> clone();
};
相关文章:
- 全球免费给出一个错误.调试器不解释
- 数组中无法解释的最后一个项目
- 作者在解释C 中的堆栈和堆时犯了一个错误,或者我正在误读某些内容
- 写一个最小的自定义操作员:std :: Sort需要std :: __ lg为我的类型解释
- 如何将输入与文件中的内容相匹配?我需要一个更好的解释
- 在C++解释编译器如何能够识别一个类是抽象的还是不抽象的
- 请解释一个特性单例(C++)
- 重新解释一个模板非类型参数:clang c++14 vs c++1z
- 有人可以向我解释一个复杂的函数指针类型吗C++
- 有人能向我解释一下我的代码的哪一部分导致***检测到glibc***吗/a2:free():无效的下一个大小(快速)
- 我能否对这C++代码的每一行中发生的事情有一个分解的解释
- 你会如何解释一个外行人或编程初学者,面向对象方法的大胆点 - 安全
- 需要解释才能理解一个引用的例子
- 需要解释为什么在定义类时使用一个冒号
- 我需要破解一个c++编译器来发出和解释一个特定的类指针作为全局数组内的索引
- 有人能解释一下为什么只有一个函数打印到控制台吗?
- 解释一个c++期中考的例子
- 有人能给我解释一下这个函数的最后一个参数吗?
- 谁能解释为什么在srand(time(0)中有一个0
- 为什么QVariant::type()返回一个QVariant::type,而它应该被解释为QMetaType:: ty