考虑到我有两个纯虚拟类,一个是从另一个派生的,一个具体的类是从上一个提到的派生的:

#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类中。

是“藏匿姓名”的情况吗?为什么只在指针类上而不是在具体类上呢?参数的数量不同不仅是封闭类型的东西。

这是创建示例的在线播放链接:
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/

10-12 21:47