具有方法重写的 C++ 继承

标签 c++ inheritance overloading

C++ 继承的非常简单的例子:

#include <iostream>
using namespace std;

class A{
 public :
 virtual void print(A a){
  cout<<"a"<<endl;
 }
};
class B : public A {
 public :
  virtual void print(A a){
  cout<<"a2"<<endl;
 }
virtual void print(B b){
  cout<<"b"<<endl;
}
};

int main(){
 B b;
 A &a = b;
 a.print(b);
 return 0;
}

为什么输出a2? 我原以为这实际上与以下内容相同: b.print(b) 谢谢!

最佳答案

因为您的引用是 A 类型,所以在决定调用什么时只会考虑 A 方法。由于 print(A) 是虚拟的,它实际上会调用 B 中与 A 中的签名相匹配的方法。

如果这令人困惑,请考虑您是否已将方法 foo 添加到 B。如果您尝试调用 a.foo() 会发生什么?它会失败,因为 A 类型的对象没有 foo 方法。

关于具有方法重写的 C++ 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21274013/

相关文章:

c++ - 如何在 Boost Asio 上组合链包装器和优先包装器

c++ - 从链表 A 和 B C++ 共有的元素创建 A linkedListC

c# - 获取抽象类的所有继承类

c# - CLR 会检查整个继承链以确定调用哪个虚方法吗?

c++ - 为什么我的回推功能不起作用,只是出现段错误

rust - Rust可以替代C++ ADL重载函数吗?

java - 将Base64(字符串或字节数组)转换为c++(opencv)中的mat(图像)

c++ - 在 C++ 中读取很长的控制台输入

javascript - 台式机和笔记本电脑的含义是什么?

java - 使用可变参数重载