c++ - 良好做法 : Default arguments for pure virtual method

标签 c++

我创建了一个抽象基类,它有一个带有默认参数的纯虚方法。

class Base {
    ...
    virtual someMethod(const SomeStruct& t = 0) = 0;
    ...
}

class Derived : public Base {
    ...
    virtual someMethod(const SomeStruct& t = 0);
    ...
}

所以我想知道将默认参数设置为纯虚拟方法并将整体设置为虚拟方法是一种好习惯吗?

最佳答案

实际上,您的代码是默认参数最糟糕的使用模式之一,因为它涉及继承和多态行为。我支持查看相关的 Scott Meyers 提示的建议,但这里有一个简短的概述:

在多态调用的情况下,根据静态类型的声明使用默认参数,而不是动态的。这是合乎逻辑的,因为运行时不知道默认参数,但打破了关于多态行为的任何合理假设。例如,

#include <cstdio>

class Base
{
        public:
                virtual void f(int a = 1)
                {
                        printf("Base::f(%d)\n", a);
                }
};

class Deriv : public Base
{
        public:
                virtual void f(int a = 2)
                {
                        printf("Deriv::f(%d)\n", a);
                }
};

int main()
{
        Base* a = new Deriv();
        a->f();
        delete a;
        return 0;
}

产量:

Deriv::f(1)

关于c++ - 良好做法 : Default arguments for pure virtual method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12139786/

相关文章:

c++ - GNU Make 会自动添加额外的先决条件吗?

c++ - 在类模板中如何检测模板参数是否为枚举类型?

C++从txt中读取行,删除空格并保存到新文件

c++ - 在 C/C++ 中实现未知表模式的数据结构?

c++ - std::upper_bound 在 const 成员函数中返回 const 迭代器

c++ - 如何指定工厂对象的类型

c++ - 如何在自定义类中隐藏迭代器和容器实现(无提升)

c++ - 半私有(private)枚举值

c++ - 用于恢复先前值的 RAII 对象

c++ - Sql Like在c++中的类似用法