gpt4 book ai didi

c++ - 重载和覆盖如何协同工作?

转载 作者:行者123 更新时间:2023-11-30 02:56:48 25 4
gpt4 key购买 nike

我了解重载和覆盖的基础知识 - 但有些事情让我感到困惑。我将尝试用一个简单的例子来解释:

  • B 类有一个函数 X(B& b)
  • D 类继承自 B 类。
  • D 类用 X(B& b) 覆盖 X,并用 X(D& d) 重载它。

然后我有以下代码:

void test(D& d1, B& b1, D& d2, B& b2){
d1.X(d2);
d1.X(b2);
b1.X(d2);
b1.X(b2);
}

int main(){
D d1, d2, d3, d4;
test(d1, d2, d3, d4);
}

我非常不确定 test() 的第三行和第四行将如何确定调用 X() 的哪些实现以及正在发生的一般机制是什么。

最佳答案

你在B(B::X)中声明了一个虚函数X,并在派生类中覆盖了X D(D::X)。如果B::XD::X的参数列表不同,B::XD::X 被认为是不同的,D::X 不会覆盖 B::X,并且 D::X 不是虚拟的(除非你用 virtual 关键字声明了它)。相反,D::X 隐藏了 B::X

#include <iostream>
using namespace std;

struct B {
virtual void X() { cout << "Class B" << endl; }
};

struct D: B {
void X(int) { cout << "Class D" << endl; }
};

int main() {
D d;
B* pb = &d;
// d.X();
pb->X();
}

你甚至不能调用d.X(),它被D::X(int)隐藏了。但是 pb->X() 没问题。

所以在你的情况下:

struct B {
virtual void X(B& b) { cout << "Class B" << endl; }
};

struct D: B {
void X(B& b) { cout << "Class D" << endl; }
void X(D& d) { cout << "Class D" << endl; }
};

D::X 将隐藏 B::X。所以 test() 中的 d1.X(d2)d1.X(b2)B::无关: X。而b1.X(d2)test()中的b1.X(b2)会调用D::X。虽然 B::X 在 D 中是不可见的,但是 D::X(B&) 是虚拟的,无论你是否声明 D::X (B&) 与 virtual 关键字。编译器知道它是一个虚函数,所以 D::X(B&) 被调用。

编辑:关于 b1.X(b2) 的更多解释,B::X 是一个虚函数,而 D::X 覆盖它,所以它肯定会通过动态绑定(bind)调用 D::X。而重载是在编译时决定的,所以不会调用D::X(D&)。

关于c++ - 重载和覆盖如何协同工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15181242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com