Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带有继承信息的前向声明_C++_Forward Declaration_Base_Derived - Fatal编程技术网

C++ 带有继承信息的前向声明

C++ 带有继承信息的前向声明,c++,forward-declaration,base,derived,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;

虽然我现在还不想尝试运行它,但它编译起来很好。然而

//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和derived的定义之上,我必须在myne的程序中为其执行类似的操作,这会导致编译错误


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

这应该起作用。你需要把其他人往上推

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

e、 g


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

因此,为了解决您的问题,您可以使
func
不内联(请参阅AbstractDisconsance中的答案),或者,如果您确实需要内联,请使用
重新解释\u cast

class base;
class derived;

class other
{
    public:
        void func() {base1 = reinterpret_cast<base*>(derived1);}
        base* base1;
        derived* derived1;
};
类基;
类派生;
其他类
{
公众:
void func(){base1=reinterpret_cast(derived1);}
基数*base1;
衍生*衍生1;
};

这是不好的,因为它不能保证由C++标准工作,如果使用多/虚拟继承,它几乎肯定不会起作用。仅当

func
必须尽可能快(即内联)并且不需要代码可移植时才使用此选项。

非常好。在这方面,以及在解决实际问题的计划中,效果都很好。我希望这将永远是问题的结束。我会记住这一点,但现在使用另一种解决方案。知道是有用的。我不知道重新诠释的演员阵容可以这样使用。
class base;
class derived;

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