向前声明继承信息

时间:2011-01-16 20:22:11

标签: c++ forward-declaration base derived

这个编译很好,虽然我不想尝试运行它。但是......

//class base;
//class derived;
//class derived : public base;

class base {};
class derived : public base {};

class other
{
    public:
        void func() {base1 = derived1;}
        base* base1;
        derived* derived1;
};

void main()
{
}

...将其他类移动到base的定义之上并派生出来,我必须在myne程序中执行类似的操作会导致编译错误。

显而易见的解决方案是在代码顶部转发声明base和派生显示的注释,但这会导致无法在base *和derived *错误之间进行转换。尝试转发声明包括继承信息也不起作用。

2 个答案:

答案 0 :(得分:9)

这应该有效。你需要移动其他人

但是在下面声明func。这样func就能“看到”派生的类型为base。

如,

class base;
class derived;
//class derived : public base;

class other
{
    public:
        void func();
        base* base1;
        derived* derived1;
};

class base {};
class derived : public base {};

void other::func() { base1 = derived1; }

答案 1 :(得分:4)

没有语法可以向前声明两个类并指定一个继承自另一个类。这是因为继承可能很复杂(多个和/或虚拟),因此赋值base1 = derived1可能涉及一些算术,当编译器只知道derived时,很难/不可能生成算术继承自base

因此,要解决您的问题,您可以使func不内联(请参阅 AbstractDissonance 的答案),或者,如果您绝对需要内联,请使用{{1 }}:

reinterpret_cast

这很糟糕,因为它不能保证按C ++标准工作,如果使用多个/虚拟继承,它几乎肯定不会起作用。仅当class base; class derived; class other { public: void func() {base1 = reinterpret_cast<base*>(derived1);} base* base1; derived* derived1; }; 必须尽可能快(即内联),并且如果您不需要您的代码可移植时,请使用此选项。