gpt4 book ai didi

c++ - 从纯虚类(A)派生的指针无法访问纯类(B)的重载方法

转载 作者:行者123 更新时间:2023-12-04 19:25:00 24 4
gpt4 key购买 nike

考虑我有两个纯虚拟类,一个派生自另一个,一个具体类派生自最后一个:

#include <iostream>
#include <string>

class Abstract1
{
public:
virtual ~Abstract1() { };
virtual void method(int a) = 0;

protected:
Abstract1() = default;
};

class Abstract2: public Abstract1
{
public:
virtual ~Abstract2() { };
virtual void method(char c, std::string s) = 0;

protected:
Abstract2() = default;
};

class Concrete : public Abstract2
{
public:
void method(int a) override
{
std::cout << __PRETTY_FUNCTION__ << "a: " << a << std::endl;
}

void method(char c, std::string s) override
{
std::cout << __PRETTY_FUNCTION__ << "c: " << c << "; s: " << s << std::endl;
}
};


当我创建类型为 Abstract2* 的指针时我无法从 Abstract1 访问覆盖方法.
int main()
{
Concrete c;
c.method(42);
c.method('a', std::string("string"));

Abstract2 *ptr_a2 = &c;
ptr_a2->method(13); //Error
ptr_a2->method('b', std::string("string2"));
}

我收到以下错误,说唯一存在的方法是 Absctract2重载:
<source>: In function 'int main()':
<source>:49:22: error: no matching function for call to 'Abstract2::method(int)'

49 | ptr_a2->method(13);

| ^

<source>:22:18: note: candidate: 'virtual void Abstract2::method(char, std::string)'

22 | virtual void method(char c, std::string s) = 0;

| ^~~~~~

<source>:22:18: note: candidate expects 2 arguments, 1 provided

有谁知道为什么会发生这种情况或如何解决?
我的意思是,我得到的唯一合理的解决方案是添加
virtual void method(int a) override = 0;

Abstract2类(class)。

是“姓名隐藏”的案例吗?为什么只在指针上而不是在具体类上呢?参数个数不同不仅是封闭式的事情。

这是创建示例的在线播放链接:
https://godbolt.org/z/gxKpzN

最佳答案

是的,名字隐藏在Abstract2 (但在 Concrete 中再次可见,其中声明了覆盖)。使其可访问的最简单方法 Abstract2是添加一个 using陈述:

class Abstract2: public Abstract1
{
public:
using Abstract1::method;
virtual void method(char c, std::string s) = 0;
};

请注意,成员函数是纯虚函数还是有定义无关紧要,无论查看具体的 Abstract2,我们看到的都是一样的。或类型的引用或指针 Abstract2 .

关于c++ - 从纯虚类(A)派生的指针无法访问纯类(B)的重载方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59756738/

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