调用基类的重载方法[重复]
Posted
技术标签:
【中文标题】调用基类的重载方法[重复]【英文标题】:Calling base class's overloaded method [duplicate] 【发布时间】:2013-03-11 11:52:16 【问题描述】:我有这个代码:
#include <iostream>
#include <string>
using namespace std;
class A
public: void Print(int i) cout<<i;
;
class B : public A
public: void Print(string s) cout<<s;
;
int main()
B bInstance;
bInstance.Print(1);
return 0;
这给了我一个错误:
error: invalid conversion from 'int' to 'const char*' [-fpermissive]
意味着它试图调用 B 的 Print 而不考虑继承的重载。但是,A 的 Print 应该可以由 B 实例调用。实际上,如果我将调用更改为
bInstance.A::Print(1);
然后它编译没有任何错误,但我想避免每次都编写类范围运算符。 有没有办法告诉编译器我正在尝试调用基类的函数重载?
【问题讨论】:
在搜索A
之前完成了重载解析,因为它在B
中找到了一些东西。使用using
语句将A
引入并让它参与重载决议。
如果我可以谦虚地建议重载的有用性有时被高估了。考虑改用不同的名称,例如 void printInt( int i );
和 void printString( string s );
【参考方案1】:
子类中的Print()
成员函数隐藏超类的成员函数Print()
。因此,编译器将看不到A::Print()
,并将尝试调用B::Print()
,抱怨int
无法转换为字符串。
要将A::Print()
引入重载集,您可以引入using
声明:
class A
public:
void Print(int i) cout<<i;
;
class B : public A
public:
using A::Print;
// ^^^^^^^^^^^^^^^
void Print(string s) cout<<s;
;
这是您的代码在必要修改后工作的live example。
【讨论】:
添加了该行,它现在给出“错误:无效 A::Print(int) 无法访问”。 @Mic,把它放在B
的public:
部分。我猜你在public: void Print(string s) cout<<s;
行之前添加了它,这会使它成为私有的。
我没有注意到'using A::Print'语句中的'public'部分,您的回答已经清晰准确,谢谢!
@Mic:很高兴它有帮助:)
链接与现场示例断开。不过很好的例子。以上是关于调用基类的重载方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章