gpt4 book ai didi

c++ - 派生时方法应该始终是虚拟的吗?

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

标题说明了一切(我不确定何时使用 virtual 关键字)。在这种情况下,函数 SaySomething() 应该是 virtual 吗? (或者也许只有在使用指针时才应该是 virtual?)

#include <iostream>

class A{
public:
void SaySomething(){
std::cout << "aaaaaa";
}
};

class B : public A{
public:
void SaySomething(){
std::cout << "bbbbbbb";
}
};

int main(){
A objectA;
B objectB;

objectA.SaySomething();
std::cout << std::endl;
objectB.SaySomething();

return 0;
}

最佳答案

从技术上讲,在这种情况下,函数 B::SaySomething 不需要是 virtual:编译器知道每个对象的运行时类型,因此它在这两种情况下都会调用正确的方法。

但是,它与基类中的 A::SaySomething 同名但没有覆盖它这一事实可能会误导代码的读者。如果您打算隐藏而不是覆盖 B 类中的 A::SaySomething,那么最佳做法是为成员函数指定一个不同的名称。

这是一个重要的情况:

B b;
A &ab(b);
b.SaySomething(); // Calls B::SaySomething
ab.SaySomething(); // Calls A::SaySomething

更改引用同一对象的方式时的行为会更改方法的行为,这并不是代码读者所期望的。如果您将 A::SaySomething 设为虚拟,则这两个调用将产生相同的行为。

关于c++ - 派生时方法应该始终是虚拟的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23504259/

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