我试图实现这样的目标:
class Base
{
public:
Base(string S)
{
...
};
}
class Derived: Base
{
public:
int foo;
string bar()
{
return stringof(foo); // actually, something more complex
};
Derived(int f) : foo(f), Base(bar())
{
};
}
现在,这并不像我想要的那样工作,因为在初始化 foo 之前,在派生构造函数中调用了 bar() 。
我考虑添加一个类似于 bar() 的静态函数,它以 foo 作为参数 - 并在初始化列表中使用它,但我想我会问是否有任何其他技术可以用来将自己从这个技术中挖掘出来。 ..
Edit:感谢您的反馈 - 这是我将如何处理静态函数。不确定静态函数和非静态函数之间的重载是否太聪明,但是......
class Derived: Base
{
public:
int foo;
static string bar(int f)
{
return stringof(f); // actually, something more complex
}
string bar()
{
return bar(foo);
};
Derived(int f) : Base(bar(f)) , foo(f)
{
};
}
是的,使用一个函数(静态类方法或常规函数)foo作为参数并返回字符串是一个很好的解决方案。您可以从 Derived::bar 调用相同的函数以防止代码重复。所以,你的构造函数看起来像这样:
Derived(int f) : Base(stringof(f)), foo(f) {}
我将对 Base 构造函数的调用放在列表的第一位,以强调初始化发生的顺序。初始化列表的顺序没有任何影响,因为所有类成员都按照它们在类主体中声明的顺序进行初始化。
这是一个非常干净、功能性的 http://en.wikipedia.org/wiki/Functional_programming解决问题的方法。但是,如果您仍然想权衡替代方案,请考虑使用作品 http://en.wikipedia.org/wiki/Object_composition而不是继承派生类和基类之间的关系:
class Base {
public:
Base(string S) { ... }
void bat() { ... }
};
class Derived {
Base *base;
int foo;
public:
Derived(int f) : base(NULL), foo(f) {
base = new Base(bar());
}
~Derived() {
delete base;
}
string bar() {
return stringof(foo); // actually, something more complex
}
void bat() {
base->bat();
}
};
您需要考虑pros http://blogs.msdn.com/steverowe/archive/2008/04/28/prefer-composition-over-inheritance.aspx以及针对您的具体情况的缺点。通过 Derived 持有对 Base 的引用,您可以更好地控制初始化顺序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)