gpt4 book ai didi

C++ 11 实现接口(interface)的方法不可用。为什么?

转载 作者:行者123 更新时间:2023-11-27 22:53:22 27 4
gpt4 key购买 nike

我有一个具体问题,在下面的示例中有所描述。我的问题是第 34 行(注释行):为什么这一行给我错误消息?

test.cpp: In function ‘int main()’:
test.cpp:34:13: error: no matching function for call to ‘C::func(int)’
c.func( 33 ); // Line 34
^
test.cpp:23:24: note: candidate: virtual void C::func(int, int)
public : virtual void func( int x, int y ) override
^
test.cpp:23:24: note: candidate expects 2 arguments, 1 provided

C 类扩展了 B 类,B 类实现了方法 func(int)。但是为什么那个方法不可用呢?如果我将 C 转换为 A,为什么 then 可用?

#include <cstdio>


class A
{
public : virtual void func( int x ) = 0;
};


class B : public A
{
public : virtual void func( int x, int y ) = 0;

public : virtual void func( int x ) override
{
func( x, 0 );
}
};


class C : public B
{
public : virtual void func( int x, int y ) override
{
printf( "x: %d y:%d\n", x, y );
}
};


int main()
{
C c;
c.func( 4, 6 );
c.func( 33 ); // Line 34

A* a = &c;
a -> func( 33 );

return 0;
}

最佳答案

这是作用域的问题...在 C 类中定义了方法 func,因此编译器显然不会尝试在中查找方法的重载上层类(Class)...要给编译器提示您对哪种方法感兴趣,您可以使用语法:

c.B::func(33);

您也可以尝试通过给这两个重载不同的名称来避免这个问题...

关于C++ 11 实现接口(interface)的方法不可用。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35379907/

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