我知道在 Base 类的构造函数中 - 调用虚拟方法时 - Base 方法被调用,而不是派生 - 请参阅Calling virtual functions inside constructors。
我的问题与这个主题有关。我只是想知道如果我在 Derived 类构造函数中调用虚方法会发生什么 - 但在构造 Base 部分之前。我的意思是调用虚方法来评估基类构造函数参数,请参见代码:
class Base {
public:
Base(const char* name) : name(name) {
cout << "Base():" << name << endl;
}
virtual const char* getName() {
cout << "Base::getName()" << endl;
return "Base";
}
protected:
const char* name;
};
class Derived : public Base {
public:
Derived() : Base(getName()) {
cout << "Derived():" << name << endl;
}
virtual const char* getName() {
cout << "Derived::getName()" << endl;
return "Derived";
}
};
int main() {
Derived d;
}
编译器 g++(4.3.x-4.5x 版本)输出为:
Derived::getName()
Base():Derived
Derived():Derived
但是我希望:
Base::getName()
Base():Base
Derived():Base
这看起来没有错 - 但考虑这个例子,它产生segmentation fault
:
class Derived : public Base {
public:
Derived() : Base(getName()), name(new string("Derived")) {
cout << "Derived():" << Base::name << endl;
}
virtual const char* getName() {
cout << "Derived::getName()" << endl;
return name->c_str();
}
private:
string* name;
};
请回答:这是正确的 g++ 行为吗?C++ 标准对此有何规定?也许这是未定义的行为?
[更新1] 我考虑了罗伯特和奥利的答案——我改变了我的第一个例子。然后它 getName() 被称为“虚拟” - 它产生分段错误。请也回答我对这部分的问题。
const char* virtualGetName(Base* basePtr)
{
return basePtr->getName();
}
class Derived : public Base {
public:
Derived() : Base(virtualGetName(this)) {
cout << "Derived():" << Base::name << endl;
}
virtual const char* getName() {
cout << "Derived::getName()" << endl;
return "Derived";
}
};