6

这编译得很好,虽然我还不想尝试运行它。然而 ...

//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()
{
}

...将其他类移到基类和派生类的定义之上,我必须在 myne 的程序中做类似的事情会导致编译错误。

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

4

2 回答 2

9

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

但是在下面声明函数。这样 func 就能够“看到”derived 是 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; }
于 2011-01-16T20:26:55.827 回答
4

没有用于前向声明两个类并指定一个从另一个继承的语法。这是因为继承可能很复杂(多重和/或虚拟),因此分配base1 = derived1可能涉及一些算术,并且当编译器只知道derived继承自base.

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

class base;
class derived;

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

这很糟糕,因为 C++ 标准不能保证它可以工作,而且如果您使用多重/虚拟继承,它几乎肯定不会工作。仅当func必须尽可能快(即inline)并且不需要可移植代码时才使用此选项。

于 2011-01-16T20:38:49.180 回答