Base class 方法别名
Base class method alias
让我们考虑以下代码:
#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()"
}
如果我有上述 classes,我可以从任何 Base
或 Derived
classes 实例调用 foo
方法,取决于我需要什么 ::foo()
。但是有一些问题:如果我需要 Derived
class 实例,但我确实需要从这个实例调用 Base::foo()
方法怎么办?
这个问题的解决方法可能是:
我将下一个方法粘贴到 class Derived
public:
void fooBase()
{
Base::foo();
}
并在我需要派生 class 实例中的 Base::foo()
方法时调用 Derived::fooBase()
。
问题是我可以使用 using
指令和类似这样的东西来做到这一点:
using Base::foo=fooBase; //I know this would not compile.
?
der1->Base::foo(); //Prints "Base::foo()"
您可以使用作用域解析调用基础 class 方法来指定函数版本并解决歧义,这在您不想使用默认解析时非常有用。
提到了类似(不完全相同的情况)示例@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)
}
让我们考虑以下代码:
#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()"
}
如果我有上述 classes,我可以从任何 Base
或 Derived
classes 实例调用 foo
方法,取决于我需要什么 ::foo()
。但是有一些问题:如果我需要 Derived
class 实例,但我确实需要从这个实例调用 Base::foo()
方法怎么办?
这个问题的解决方法可能是: 我将下一个方法粘贴到 class Derived
public:
void fooBase()
{
Base::foo();
}
并在我需要派生 class 实例中的 Base::foo()
方法时调用 Derived::fooBase()
。
问题是我可以使用 using
指令和类似这样的东西来做到这一点:
using Base::foo=fooBase; //I know this would not compile.
?
der1->Base::foo(); //Prints "Base::foo()"
您可以使用作用域解析调用基础 class 方法来指定函数版本并解决歧义,这在您不想使用默认解析时非常有用。
提到了类似(不完全相同的情况)示例@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) }