【问题标题】:Polymorphism & default values: can co-exist? [duplicate]多态性和默认值:可以共存吗? [复制]
【发布时间】:2013-05-13 16:41:26
【问题描述】:

我有一个基类,其中包含许多继承的派生类。像这样:

class A {
public:
    virtual void f(string foo = "bar") {
        cout << foo << endl;
    }
};

class B: public A {
public:
    void f(string foo = "howdy") {
        cout << foo << endl;
    }
};

class C: public A {
public:
    void f(string foo = "something") {
        cout << foo << endl;
    }
};

为了简洁起见,我只继承了两个类。
这是主要的:

A* aArray[] = {
    new B,
    new C,
};

int main() {
    aArray[0]->f();
    aArray[0]->f();

    return 0;
}

当我运行程序时,我得到的输出是:

bar
bar

就像编译器忽略被覆盖函数的默认参数一样。
这是正常的,还是我做错了什么或者我遗漏了什么?

【问题讨论】:

  • 默认参数可能使函数签名不同。将警告调到最大并重新编译。
  • @ThomasMatthews:那么解决方案可能是什么?把基类虚函数中的默认参数去掉,保留在继承的重写函数中就可以了吗?
  • @Overflowh:做个实验:去掉函数签名中的默认赋值,重新测试。
  • @ThomasMatthews:我首先尝试仅删除基类中的默认参数,但它不起作用。然后我尝试删除 all 程序中的默认参数,但错误仍然存​​在。如果现在它打印正确的值。
  • @ThomasMatthews:好的,经过一番尝试,现在一切正常。响应是默认参数不能放在任何地方。无论是在基类中还是在派生类中,否则编译器会抱怨说函数具有不同的签名。

标签: c++ inheritance polymorphism virtual


【解决方案1】:

默认值是静态绑定的。换句话说,它们没有多态行为。这就是你看到的原因

 bar
 bar

而不是派生类的虚函数中的那些默认值。

根据 Effective C+:

如果默认参数值是动态绑定的,编译器将不得不想出一种方法来在运行时确定虚函数参数的适当默认值,这将比在编译期间确定它们的当前机制更慢且更复杂.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-24
    • 2011-12-22
    • 2014-12-23
    • 2013-04-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多