虚函数重载

dra*_*osb 2 c++ polymorphism overloading

让我们说我们有:

Class A
{
public:
   virtual void print(){ std::cout<<" A "<<endl; }
}

Class B : public A
{
public:
   virtual void print(int x){ std::cout<<" B "<<endl;}

}
Run Code Online (Sandbox Code Playgroud)

我认为函数print的B类定义会隐藏A类的函数print.但是下面的代码工作并打印"A"

int main()
{

A * a = new B;

a->print();

return 0;
}  
Run Code Online (Sandbox Code Playgroud)

如果我像这样写主函数它不起作用:

int main()
{

B b;

b.print();

return 0;
}  
Run Code Online (Sandbox Code Playgroud)

我想知道的是...在我的第一个main()示例中,我有一个调用print()的B对象...不应该print()被隐藏并且有一个错误,就像在第二个main()示例中一样

bla*_*ird 6

成员函数print()in B不会覆盖print()in,A因为它具有不同的签名.因此,当print()你在第一个未经编辑的版本中main()调用时,只有一个匹配函数可以调用,正如用户juanchopanza所指出的:A::print().

编辑:总结:

  • 多态行为:如果A::print()并且B::print()具有相同的签名,print()只要通过指针或引用引用对象,就会在运行时选择适当的签名.

  • 函数重载:由于类是作用域而函数不跨作用域重载,因此基类中的函数被派生类中的同名函数隐藏.为此,用于引用对象的变量类型是重要的,而不是对象本身的类型.因此,在第二个示例中,您会收到一个错误,即没有匹配的函数可以调用,但在第一个示例中,只有一个函数在范围内.