2016-03-23 52 views
1

让我们看看下面的代码:基类方法的别名

#include <iostream> 

class Base 
{ 
public: 
    void foo() //Here we have some method called foo. 
    { 
     std::cout << "Base::foo()\n"; 
    } 
}; 

class Derived : public Base 
{ 
public: 
    void foo() //Here we override the Base::foo() with Derived::foo() 
    { 
     std::cout << "Derived::foo()\n"; 
    } 
}; 

int main() 
{ 
    Base *base1 = new Base; 
    Derived *der1 = new Derived; 
    base1->foo(); //Prints "Base::foo()" 
    der1->foo(); //Prints "Derived::foo()" 
} 

如果我有上述类别,我可以从任何BaseDerived类实例调用foo方法,这取决于我需要什么::foo()。但是有一些问题:如果我需要Derived类实例,但是我确实需要从这个实例调用Base::foo()方法?

这个问题的解决可能是下一个: 我下一个方法粘贴到派生

public: 
void fooBase() 
{ 
    Base::foo(); 
} 

类和调用Derived::fooBase()当我需要从派生类的实例Base::foo()方法。

问题是我能做到这一点使用using指令像这样的东西:

using Base::foo=fooBase; //I know this would not compile. 

回答

2
der1->Base::foo(); //Prints "Base::foo()" 

您可以使用作用域分辨率调用基类方法来指定函数版本并解决在不想使用默认分辨率时有用的歧义。

类似(不完全是相同的情况下)例如提及@cppreference

struct B { virtual void foo(); }; 
struct D : B { void foo() override; }; 
int main() 
{ 
    D x; 
    B& b = x; 
    b.foo(); // calls D::foo (virtual dispatch) 
    b.B::foo(); // calls B::foo (static dispatch) 
}