0

派生クラスのメソッドと同じ名前の基本クラスからメソッドを呼び出そうとしています。簡単な例を次に示します。

#include <iostream>

using namespace std;

class Base
{
public:
    void print() {
        cout << "Printing from base" << endl;
    }

    void print(int num) {
        cout << "Printing number from base: " << num << endl;
    }
};

class Derived : public Base
{
    using Base::print;

public:
    void print() {
        cout << "Printing from derived" << endl;
    }
};


int main()
{
    Derived x;

    x.print();
    x.Base::print(1);

    //x.print(1); // Gives a compilation error

    return 0;
}

基本的には、 x.print(1) を呼び出して "Printing number from base: 1" を取得できるようにしたいと考えています。つまり、基本クラスに存在するにもかかわらず、署名に一致するメソッドを自動的に呼び出すことができます。

がなければ、using Base::print;名前error: no matching function for call to 'Derived::print(int)'が隠されているため完全に理にかなっています。

したがって、その行を追加しましたが、エラーは次のとおりですerror: 'void Base::print(int)' is inaccessible

これはなぜですか?私はパブリック継承を使用しているので、すぐに利用できると思っていたでしょうか?

例に示されているように、手動で を呼び出すと問題なく動作x.Base::print(1);しますが、より透過的に実行したいと考えています。もちろん、派生クラスの関数にラッパーを再実装することもできますが、それもあまりエレガントではないようです。

これが以前の質問でカバーされていた場合は申し訳ありません。私はそれらの束を読み、多くの同様のケースを見つけましたが、何も助けにはなりませんでした。

4

2 に答える 2

4

using ディレクティブの配置によって、可視性が決まります。公共エリアに置くだけで問題ありません。

//...
class Derived : public Base
{

public:
    using Base::print;

    void print() {
        cout << "Printing from base" << endl;
    }
};
//...

http://ideone.com/06NNk

于 2012-09-13T12:40:24.333 に答える
0

関数を仮想化できます。オーバーロードされていない基本クラスから継承された仮想関数は、派生クラスを介して呼び出されます。

class base 
{
  public:
    virtual void Foo() {}
}

class Derived
{
}

Derived d;
d.foo(); // calls base::foo()
于 2012-09-13T12:44:41.757 に答える