假设我们有:
Class A
{
public:
virtual void print(){ std::cout<<" A "<<endl; }
}
Class B : public A
{
public:
virtual void print(int x){ std::cout<<" B "<<endl;}
}
我认为 B 类中函数 print 的定义会隐藏类 A 的函数 print。但是下面的代码有效并打印出“A”
int main()
{
A * a = new B;
a->print();
return 0;
}
如果我这样写主函数,它就不起作用:
int main()
{
B b;
b.print();
return 0;
}
我想知道的是...在我的第一个 main() 示例中,我有一个调用 print() 的 B 对象...不应该隐藏 print() 并出现类似第二个 main() 的错误例子
最佳答案
B
中的成员函数 print()
没有覆盖 A
中的 print()
因为它有不同的签名。因此,当在您的第一个未编辑版本的 main()
中调用 print()
时,只有一个匹配的函数可以调用,正如用户 juanchopanza 所指出的:A::print()
.
编辑:总结:
多态行为:如果
A::print()
和B::print()
具有相同的签名,则只要您通过指针或引用引用对象,就会在运行时选择合适的print()
。函数重载:由于类是一个范围,函数不会跨范围重载,因此基类的函数会被派生类中的同名函数隐藏。为此,您用来引用对象的变量类型才是最重要的,不是对象本身的类型。因此,在您的第二个示例中,您会收到一个错误消息,指出没有要调用的匹配函数,但在您的第一个示例中,范围内只有一个函数。
关于c++ - 虚函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20652388/