c++ - 虚函数重载

标签 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;}

}

我认为 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/

相关文章:

templates - 虚函数可以用auto参数代替吗?

generics - haskell Data.HList 的简单使用示例

c++ - 覆盖中的几个基本问​​题

c++ - 在标题栏中添加一个按钮

c++ - 我能保证 Sleep() 不会休眠超过 10 毫秒吗?

java - Java 中的重载和多重调度

c++ - 即使我重载分配也没有可行的重载 '='错误

java - 尝试使用 String 和 URL 数组作为参数实现两个构造函数会产生不明确的错误

c++ - 从共享缓冲区写入文件丢失数据和程序崩溃而没有 cout

c++ - 对多个字段的元素进行排序