我正在尝试执行以下操作:
class Animal
{
class Bear : public Animal
{
// …
};
class Giraffe : public Animal
{
// …
};
};
…但我的编译器似乎对此感到窒息。这是合法的 C++,如果不是,有没有更好的方法来完成同样的事情?本质上,我想创建一个更简洁的类命名方案。(我不想Animal
从公共基类派生内部类)
我正在尝试执行以下操作:
class Animal
{
class Bear : public Animal
{
// …
};
class Giraffe : public Animal
{
// …
};
};
…但我的编译器似乎对此感到窒息。这是合法的 C++,如果不是,有没有更好的方法来完成同样的事情?本质上,我想创建一个更简洁的类命名方案。(我不想Animal
从公共基类派生内部类)
你可以做你想做的事,但你必须延迟嵌套类的定义。
class Animal
{
class Bear;
class Giraffe;
};
class Animal::Bear : public Animal {};
class Animal::Giraffe : public Animal {};
类类型被认为是不完整的,直到其定义结束。你不能从不完整的类继承,所以你不能从封闭类继承。
编辑:更正
正如 Richard Wolf 纠正我的那样:如果您延迟嵌套类的定义,则可以从封闭类继承。有关详细信息,请参阅他的答案。
我不清楚你想在这里实现什么,但你可以通过命名空间获得它。
namespace creatures
{
class Animal
{
};
class Bear : public Animal
{
};
class Giraffe : public Animal
{
};
}
这将 Bear 和 Giraffe 声明为动物类型,但如果您正在寻找不污染全局命名空间的基类,则将整个事物放在命名空间中。
并没有真正回答这个问题,但我认为你在滥用嵌套类,也许你应该看看命名空间(顺便说一句,答案是“不可能,因为 Animal 是一个不完整的类型”)。
“颠倒继承”的 ATL 方法总是值得考虑的。每次我需要这样做时都让我头疼,但是你得到的目标代码的效率是无与伦比的。我在某处剪辑了 Jim Beveridge 的文章,这是我见过的最好的解释,但今天很难找到,我只看到了对它的引用。
“2004 年 3 月 25 日 ... Jim Beveridge 的一篇优秀文章:ATL 和颠倒继承..”