3 回答
TA贡献1829条经验 获得超6个赞
我一直使用“继承”而不是超级。(可能是由于Delphi的背景),我总是将其设置为private,以避免在类中错误地省略“继承”但子类尝试使用它时的问题。
class MyClass : public MyBase
{
private: // Prevents erroneous use by other classes.
typedef MyBase inherited;
...
用于创建新类的标准“代码模板”包括typedef,因此我几乎没有机会无意忽略它。
我认为链式的“ super :: super”建议不是一个好主意-如果这样做,您可能很难与特定的层次结构绑定在一起,并且更改它可能会严重破坏某些东西。
TA贡献1784条经验 获得超8个赞
这样做的一个问题是,如果您忘记(重新)定义派生类的super,那么对super :: something的任何调用都会编译良好,但可能不会调用所需的函数。
例如:
class Base
{
public: virtual void foo() { ... }
};
class Derived: public Base
{
public:
typedef Base super;
virtual void foo()
{
super::foo(); // call superclass implementation
// do other stuff
...
}
};
class DerivedAgain: public Derived
{
public:
virtual void foo()
{
// Call superclass function
super::foo(); // oops, calls Base::foo() rather than Derived::foo()
...
}
};
(如Martin York在对此答案的评论中所指出的,可以通过将typedef设置为私有而不是公共或受保护来消除此问题。)
- 3 回答
- 0 关注
- 597 浏览
添加回答
举报