C++ Base构造函数使用将在派生构造函数中构造的参数进行调用

Pet*_*isu 5 c++ oop constructor virtual-functions class

问题1)

class Base {
    Base(std::string name);

    virtual std::string generateName();
}

class Derived : Base {
    Derived();

    virtual std::string generateName();
}
Run Code Online (Sandbox Code Playgroud)

这里有一个问题:

将在generateName()上调用什么方法?

Derived :: Derived : Base(generateName()) {
    //what method will be called on generateName() ? 
}
Run Code Online (Sandbox Code Playgroud)

问题2)

我该怎么做?如果默认构造函数必须接受一个参数,但我需要在Derived构造函数中生成该参数?

Jam*_*lis 8

首先,解决方案:使用静态成员函数或非成员函数.

至于行为,Derived::generateName()将被调用.C++标准中定义此行为的长句说(C++ 03 12.7/3):

当直接或间接地从构造函数(包括来自数据成员的mem-initializer)或析构函数调用虚函数时,调用所适用的对象是正在构造或销毁的对象,调用的函数是一个在构造函数或析构函数自己的类或其基础中定义的,但不是在从构造函数或析构函数的类派生的类中重写它的函数,或者在最派生对象的其他基类之一中重写它.

因为在虚拟调用时执行的Derived构造函数Derived::generateName()是构造函数,所以被调用.

现在删除的答案正确地提到了Scott Meyers的一篇文章,该文章建议"在施工或销毁期间永远不要调用虚函数". 被称为覆盖者的规则是复杂且难以记住的.

  • 如果从*inside*`Base :: Base`中调用`generateName()`,则会出现这种情况.但是在这里,我们在初始化列表中调用它,然后才输入`Base :: Base`.这仍然是真的吗? (3认同)