1

このコードを検討してください

class Base
{
public:
    virtual void print ()
    {
        std::cout << "Base::print" << std::endl;
    }
};

class BaseA : public Base
{
public:
    virtual void print ()
    {
        std::cout << "BaseA::print" << std::endl;
    }
};

class Derived : public Base
{
public:
    virtual void print ()
    {
        Base::print (); // <= this will always call Base::print even if I derive from BaseA
        std::cout << "Derived::print" << std::endl;
    }

};


int main ()
{
    Base* a = new Derived;
    a->print ();
    delete a;
}

From Derived::printI を呼び出すのは問題ありませんが、代わりにfromBase::printを派生させたいと思うまでは、もちろん を呼び出したいと思います。この特定の例での変更は問題ではありませんが、そのような仮想関数が 20 個ある場合はどうなるでしょうか?DerivedBaseABaseA::printBase::printBaseA::print

それが何であれ、直接の親のバージョンを呼び出すようにコンパイラに依頼する方法printは?

4

2 に答える 2

2

typedefを使用します:

class Derived: public BaseA {
    typedef BaseA Base;
    ...

提案はありますが、クラスの直接のベースのコンパイル時のイントロスペクションは現在不可能です(例:http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3326.pdf )。

于 2012-11-29T09:13:05.510 に答える
0

テンプレートで試すことができます:

template <class base>
class test: public base
{
    virtual void testmethod()
    {
        base::testmethod();
    }
};

次に、typedef を追加できます。

typedef test<myBaseClass> myDerivedClass;
于 2012-11-29T09:21:00.717 に答える