gpt4 book ai didi

c++ - 按值和多态调用时的隐式转换

转载 作者:搜寻专家 更新时间:2023-10-31 01:48:51 24 4
gpt4 key购买 nike

考虑以下场景:一些多态类:

struct iClass 
{
virtual ~iClass(){}
};
struct CommonClass : public iClass
{
char str[128];
CommonClass() { ... }
...
};
struct SpecificClass : public iClass
{
char str[32];
SpecificClass () { ... }
SpecificClass (SpecificClass& src) { strcpy(...); ... }
SpecificClass (CommonClass& src) { strcpy(...); ... }
SpecificClass (const CommonClass& src) { strcpy(...); ... }
void foo() { ... }
};

还有一个函数:

void someFunc(SpecificClass sc) { sc.foo(); } // pass by value: i want it copied!

int main ()
{
CommonClass comCl;
someFunc(comCl); // <- Error: no matching function for call to 'SpecificClass::SpecificClass(SpecificClass)' NOTE: no &
SpecificClass specCl(comCl);
someFunc(specCl); // Works normal, but the str gets copied double times this way, isnt it?
return 0;
}

为什么编译器不允许在第一个函数调用中从 CommonClass 转换为 SpecificClass,尽管无论如何都会在调用时构造一个新的 SpecificClass 并且有一个用于此特定转换的构造函数?为什么我会收到这个奇怪的错误消息?在没有引用的情况下调用复制构造函数?任何人都可以分享对这个问题的一些见解吗?

顺便说一句,我必须使用 gcc 4.1.2

最佳答案

someFunc 需要一个类型为 SpecificClass 的参数,而您提供了一个类型为 CommonClass 的参数。由于您已经定义了转换构造函数

SpecificClass::SpecificClass(CommonClass &)

此转换可以隐式执行,到目前为止这非常好。

[不过请注意,您的转换构造函数采用非常量引用,它在这里起作用是因为您实际上为它提供了一个左值——但是,一般来说,我假设将转换构造函数的参数作为 const CommonClass & 通常更好(因为从一种类型到另一种类型的转换通常不会改变原始类型)。]

但是,问题 出现在下一步:SpecificClass 类型的新转换对象现在需要复制到函数参数 scsomeFunc。为此,您需要 SpecificClass 的复制构造函数,它可以采用右值(这就是新转换的 SpecificClass 对象,因为它是临时的)。

你的拷贝构造函数

SpecificClass::SpecificClass(SpecificClass &)

被声明为采用非 const 左值引用,它不能绑定(bind)到临时对象。所以你必须把它改成

SpecificClass::SpecificClass(const SpecificClass &)

解决问题。无论如何,这是声明复制构造函数的常用方法。


还有一件事我不能不注意到:你有一个函数 someFunc ,它只能在非常特定类型的对象上调用。但是您在一般(基类?)类型上调用它。显然,这可以按照您描述的方式工作,但它在许多方面违反直觉并且不符合面向对象编程的原则。这也让我想知道“特定”对象实际上是如何从“通用”对象创建的,即转换构造函数实际上做了什么。直觉上,我假设作为输入给出的“通用”对象缺少创建“特定”对象的“特定”信息。

无论如何,您可能需要重新考虑类层次结构和/或someFunc 的用途。不过,这些都与您问题中描述的问题没有直接关系。

关于c++ - 按值和多态调用时的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17229959/

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