gpt4 book ai didi

c++ - 在不使用虚函数的情况下覆盖对 C++ 中基类的调用?

转载 作者:太空狗 更新时间:2023-10-29 23:53:14 27 4
gpt4 key购买 nike

给定一个基类 A,定义了 A::getA::add 函数。

class A { 
public:
int get() { return 3; }
int add() {
return get() + get();
}
};

注意 A::add 调用 A::get。派生类 B 是否可以调用 A::add 但使用它自己的 B::get 函数?像这样的东西:

class B : public A {
int get() { return 7; }
};

#include <iostream>

int main() {
A foo;
std::cout << foo.add() << std::endl;

B bar;
std::cout << bar.add() << std::endl;
return 0;
}

在第二种情况下,预期输出是 14 而不是 6。如果可以控制 A,我可以使 ::get 成为一个虚函数,每个派生类都可以根据需要实现它。但是,让我们假设 A 是不可变的——我如何调用正确的 ::get

最佳答案

不,这是不可能的:假设 A 被单独编译并作为预编译库提供给您,看看为什么。

由于 A::get 不是虚拟的,编译器直接插入对 A::get 的调用,而不通过 vtable 进行任何间接调用。 , 到 A::add 的输出中。此外,如果编译器选择这样做,它甚至可以内联调用,将 3 的返回“烘焙”到它的输出中。

关于c++ - 在不使用虚函数的情况下覆盖对 C++ 中基类的调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11941046/

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