为什么标准提供了两个调用函数的选项



考虑以下代码:

#include <iostream>
class Base
{
public:
void Message()
{
std::cout<<"You are calling the function of class Base ";
}
};
class Derived : public Base
{
public:
void Message()
{
std::cout<<"You are calling the function of class Derived ";
}
};
int main()
{
Derived obj1;
obj1.Base::Message();
return 0;
} 

这两行代码:

Derived obj1;
obj1.Base::Message();

调用从Base派生的类Derived。第二行代码调用Base类重写的函数Message

当我们可以用这个代码直接调用函数Message时,为什么标准会引入obj1.Base::Message()

Base obj1;
obj1.Message();
如果要在类型为Derived的对象上调用该函数,则Base::Message是必需的。在您给出的特定示例中,确实有一种替代方法是使用static_cast<Base&>(derived).Message()。然而,在Message是一个虚拟函数的情况下,这是不起作用的——您总是从最派生的类中获得Message

经常使用这种方法的一个地方是,如果您正在重写虚拟函数,但希望从派生函数中调用基函数。例如:

class Base
{
public:
virtual void Message()
{
std::cout<<"You are calling the function of class Base ";
}
};
class Derived : public Base
{
public:
void Message() override
{
Base::Message();
std::cout<<"(and now for the Derived-only part of the message)";
}
};

相关内容

  • 没有找到相关文章

最新更新