gpt4 book ai didi

c++ - 纯虚函数中的默认值参数

转载 作者:搜寻专家 更新时间:2023-10-31 02:04:36 25 4
gpt4 key购买 nike

我提交了一些代码:

抽象类:

virtual void someFunction(std::vector<someObject*> & iObject) = 0;
virtual void someFunction(std::vector<someObject*> & iObject, bool aSwitch) = 0;

第一个函数已经存在,我添加了第二个函数以避免在纯方法中使用默认值参数。

派生类中的 header :

virtual void someFunction(std::vector<someObject*> & iObject);
virtual void someFunction(std::vector<someObject*> & iObject, bool aSwitch = false);

按预期使用:

someFunction(std::vector<someObject*> & Object);

someFunction(std::vector<someObject*> & Object, true);

someFunction 原样 - 已经存在,我添加了开关。它运作良好,但我很困惑。

我有一个代码审阅者说我应该在纯虚函数中包含一个默认值以避免两个函数签名。我记得读过纯虚拟中的默认值不是一个好主意,但我不能争论一个有效的观点,而且文章似乎也不清楚为什么。

如果我添加默认值会导致歧义吗?如果是这样,我是否仍需要派生虚方法中的默认值?

我可以只在纯虚函数中添加默认值并取消派生类头文件中的第一个函数吗?这里的最佳做法是什么?

最佳答案

一般的默认参数

函数的默认参数未绑定(bind)到函数本身,而是绑定(bind)到调用上下文:将使用在调用范围内为函数声明的默认值(参见 C++ 标准, [dcl.fct.default])。对于 example :

void f(int a=1);     // forward declaration with a default value for the compilation unit
void f(int a) // definition
{
cout<<a<<endl;
}
void g() {
void f(int a=2); // declaration in the scope of g
f();
}
int main() {
f(); // uses general default => 1
g(); // uses default defined in g => 2
return 0;
}

虚函数的默认参数

此逻辑适用于所有函数,因此也适用于纯虚函数。唯一的事情是,所考虑的函数声明(及其默认值)是编译器已知的对象类之一。因此,同一对象的同一函数可能具有不同的默认参数,具体取决于用于调用它的对象类型。对于 example :

struct A {
virtual void f(int a=1) = 0;
};
struct B:A {
void f(int a) override ;
};
struct C:A {
void f(int a=2) override ;
};

void B::f(int a) // definition
{
cout<<"B"<<a<<endl;
}
void C::f(int a) // definition
{
cout<<"C"<<a<<endl;
}

int main() {
B b;
C c;
A *x=&c, *y=&b; // points to the same objects but using a polymorphic pointer
x->f(); // default value defined for A::f() but with the implementation of C ==> C1
y->f(); // default value defined for A::f() but with the implementation of B ==> B1
// b.f(); // default not defined for B::f() so cannot compile
c.f(); // default value defined for C::f(); ==> C2
}

很高兴知道

  • 默认参数不会改变函数的签名。它仍然是相同的功能。
  • 不同的默认参数不会影响 ODR 规则。所以你可以在不同的编译单元中使用不同的默认值,它仍然是同一个函数。
  • 默认参数由调用者提供,而不是函数本身
  • 如果为基类和派生类定义了不同的默认参数,您需要格外小心,因为根据调用函数的方式可能会使用不同的默认参数。

关于c++ - 纯虚函数中的默认值参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53272510/

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