Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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/2/unit-testing/4.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++;以void*和其他指针类型为参数的多态函数:是否被认为是不明确的?_C++_Overloading_Implicit Conversion_Void Pointers_Pointer Conversion - Fatal编程技术网

C++ C++;以void*和其他指针类型为参数的多态函数:是否被认为是不明确的?

C++ C++;以void*和其他指针类型为参数的多态函数:是否被认为是不明确的?,c++,overloading,implicit-conversion,void-pointers,pointer-conversion,C++,Overloading,Implicit Conversion,Void Pointers,Pointer Conversion,以void*和其他指针类型作为参数的C++多态函数:是否认为它不明确 我担心,由于任何指针都可能被强制转换到void*,下面的第二个bar调用是否会在下面的程序中执行void bar(void*),而不是我预期的void bar(int*) 我在我的g++上进行了测试,它按预期运行(即int*不会转换为void*)。但是,在C++语言规范方面,有谁能对此问题进行评论/回答? foo.h: class Foo { public: void bar(void *); void bar

void*
和其他指针类型作为参数的C++多态函数:是否认为它不明确

我担心,由于任何指针都可能被强制转换到
void*
,下面的第二个bar调用是否会在下面的程序中执行
void bar(void*)
,而不是我预期的
void bar(int*)

我在我的g++上进行了测试,它按预期运行(即int*不会转换为void*)。但是,在C++语言规范方面,有谁能对此问题进行评论/回答?

foo.h:

class Foo {
public:
    void bar(void *);
    void bar(int *);
};
main.cpp:

...
struct A *p1;
int *p2;
Foo foo;
...
foo.bar(p1);
foo.bar(p2);
此外,比如说,
bar
现在是虚拟多态函数,将
void*
参数作为第一种形式,将基抽象类指针参数作为第二种形式。使用派生类指针作为参数的调用将执行第一种形式还是第二种形式?i、 e.在调用
bar()

之前,派生类指针是否会被强制转换为其基础抽象类指针(因此第二种形式将起作用),还是会被强制转换为
void*
(因此第一种形式将起作用),因为参数可以转换为任一函数的参数类型,在这种情况下,最好的可行函数是隐式转换更好的函数

用于:

第一个是等级3(转换),第二个是等级1(精确匹配)。由于精确匹配(不需要转换)优于转换,因此它将调用
voidbar(int*)

但是,在第二种情况下,情况会变得更复杂:

class Foo {
  public:
    virtual void bar(void*);
    virtual void bar(Foo*);
    virtual ~Foo() = default;
};

class FooTwo : public Foo {};

// ...

Foo foo;
FooTwo footwo;

foo.bar(&footwo);
由于两者都是排名3(转换),因此遵循转换排名规则。由于两个转换都具有相同的转换排名,因此这将转到扩展的转换排名规则。扩展规则2规定:

将指针转换为派生指针到基指针的转换比将指针转换为派生指针到空指针的转换好,将指针转换为基指针到空指针的转换比将指针转换为派生指针到空指针的转换好

考虑到这一点,
void bar(Foo*)
被认为比
void bar(void*)
更匹配,这意味着它将由
Foo.bar(&footwo)选择

请参阅后者的示例。

根据,由于参数可以转换为任一函数的参数类型,因此在这种情况下,最好的可行函数是隐式转换更好的函数

用于:

第一个是等级3(转换),第二个是等级1(精确匹配)。由于精确匹配(不需要转换)优于转换,因此它将调用
voidbar(int*)

但是,在第二种情况下,情况会变得更复杂:

class Foo {
  public:
    virtual void bar(void*);
    virtual void bar(Foo*);
    virtual ~Foo() = default;
};

class FooTwo : public Foo {};

// ...

Foo foo;
FooTwo footwo;

foo.bar(&footwo);
由于两者都是排名3(转换),因此遵循转换排名规则。由于两个转换都具有相同的转换排名,因此这将转到扩展的转换排名规则。扩展规则2规定:

将指针转换为派生指针到基指针的转换比将指针转换为派生指针到空指针的转换好,将指针转换为基指针到空指针的转换比将指针转换为派生指针到空指针的转换好

考虑到这一点,
void bar(Foo*)
被认为比
void bar(void*)
更匹配,这意味着它将由
Foo.bar(&footwo)选择


请参阅后一个示例。

int*
void*
更适合,因此在您的示例中会调用它,但为什么还要使用
void*
?也写出您的多态性案例,并进行测试,看看会发生什么。如果您仍然对其发生的原因感兴趣,请发布与您所询问的方式相同的代码。@Bartek:
void*
是隐藏内部数据结构(如内部状态)的常用方法。调用方把它当作一个黑箱,可以把它作为一个参数传递。@ RubsiuSui我会说使用模板在C++中更常见。<代码> int */COD>比 Value>代码>更适合,所以它将在你的例子中被调用,但是你为什么还要使用<代码> Value*/Cuth>?写出你的多态性案例并测试看看发生了什么。如果您仍然对其发生的原因感兴趣,请发布与您所询问的方式相同的代码。@Bartek:
void*
是隐藏内部数据结构(如内部状态)的常用方法。调用方把它当作一个黑箱,可以把它作为一个参数传递。@ RubsiuSui我会说使用模板在C++中更为常见。