如果要在类型为
考虑以下代码:
#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)";
}
};