【问题标题】: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 );

标签: c++ class inheritance methods overloading


【解决方案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,把它放在Bpublic: 部分。我猜你在public: void Print(string s) {cout&lt;&lt;s;} 行之前添加了它,这会使它成为私有的。
  • 我没有注意到'using A::Print'语句中的'public'部分,您的回答已经清晰准确,谢谢!
  • @Mic:很高兴它有帮助:)
  • 链接与现场示例断开。不过很好的例子。
猜你喜欢
  • 2010-12-05
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
相关资源
最近更新 更多