Pai*_*sco 5 c++ pure-virtual name-hiding c++11
考虑我有两个纯虚拟类,一个派生自另一个,一个具体类派生自最后一个:
#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;
}
};
Run Code Online (Sandbox Code Playgroud)
当我创建该类型的指针时,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"));
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误,说唯一存在的方法是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
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么会发生这种情况或如何解决?我的意思是,我得到的唯一合理的解决方案是添加
virtual void method(int a) override = 0;
Run Code Online (Sandbox Code Playgroud)
内部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;
};
Run Code Online (Sandbox Code Playgroud)
请注意,成员函数是纯虚函数还是有定义并不重要,无论是查看具体函数Abstract2还是指向类型的引用或指针,我们都会看到相同的情况Abstract2。
| 归档时间: |
|
| 查看次数: |
82 次 |
| 最近记录: |